@zerodev/wallet-react-ui 0.0.7 → 0.0.9

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 (62) hide show
  1. package/README.md +20 -5
  2. package/dist/_types/auth/components/WalletGridSheet/index.d.ts +15 -0
  3. package/dist/_types/auth/components/WalletGridSheet/index.d.ts.map +1 -0
  4. package/dist/_types/auth/index.d.ts.map +1 -1
  5. package/dist/_types/auth/pages/SignUp/InstalledWallets.d.ts +12 -0
  6. package/dist/_types/auth/pages/SignUp/InstalledWallets.d.ts.map +1 -0
  7. package/dist/_types/auth/pages/SignUp/MoreWallets.d.ts +5 -0
  8. package/dist/_types/auth/pages/SignUp/MoreWallets.d.ts.map +1 -0
  9. package/dist/_types/auth/pages/SignUp/Wallet.d.ts +7 -0
  10. package/dist/_types/auth/pages/SignUp/Wallet.d.ts.map +1 -0
  11. package/dist/_types/auth/pages/SignUp/context.d.ts +5 -0
  12. package/dist/_types/auth/pages/SignUp/context.d.ts.map +1 -1
  13. package/dist/_types/auth/pages/SignUp/index.d.ts +6 -0
  14. package/dist/_types/auth/pages/SignUp/index.d.ts.map +1 -1
  15. package/dist/_types/auth/types.d.ts +2 -2
  16. package/dist/_types/auth/types.d.ts.map +1 -1
  17. package/dist/_types/auth/utils/isCancellationError.d.ts.map +1 -1
  18. package/dist/_types/auth/walletGuide.d.ts +108 -0
  19. package/dist/_types/auth/walletGuide.d.ts.map +1 -0
  20. package/dist/_types/history/components/TxHistoryItem/index.d.ts +21 -0
  21. package/dist/_types/history/components/TxHistoryItem/index.d.ts.map +1 -0
  22. package/dist/_types/history/mocks.d.ts +8 -0
  23. package/dist/_types/history/mocks.d.ts.map +1 -0
  24. package/dist/_types/history/pages/History.d.ts +10 -0
  25. package/dist/_types/history/pages/History.d.ts.map +1 -0
  26. package/dist/_types/history/pages/index.d.ts +24 -0
  27. package/dist/_types/history/pages/index.d.ts.map +1 -0
  28. package/dist/_types/history/types.d.ts +29 -0
  29. package/dist/_types/history/types.d.ts.map +1 -0
  30. package/dist/_types/history/utils/groupByDay.d.ts +13 -0
  31. package/dist/_types/history/utils/groupByDay.d.ts.map +1 -0
  32. package/dist/_types/index.d.ts +3 -0
  33. package/dist/_types/index.d.ts.map +1 -1
  34. package/dist/_types/shared/components/TokenSummary/index.d.ts +18 -0
  35. package/dist/_types/shared/components/TokenSummary/index.d.ts.map +1 -0
  36. package/dist/index.cjs +3 -3
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.mjs +974 -483
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/styles.css +1 -1
  41. package/package.json +4 -4
  42. package/src/auth/components/WalletGridSheet/index.tsx +77 -0
  43. package/src/auth/index.tsx +0 -13
  44. package/src/auth/pages/SignUp/InstalledWallets.tsx +95 -0
  45. package/src/auth/pages/SignUp/MoreWallets.tsx +105 -0
  46. package/src/auth/pages/SignUp/Wallet.tsx +81 -0
  47. package/src/auth/pages/SignUp/context.tsx +5 -0
  48. package/src/auth/pages/SignUp/index.tsx +30 -4
  49. package/src/auth/types.ts +1 -2
  50. package/src/auth/utils/isCancellationError.ts +2 -0
  51. package/src/auth/walletGuide.ts +132 -0
  52. package/src/history/components/TxHistoryItem/index.tsx +108 -0
  53. package/src/history/mocks.ts +80 -0
  54. package/src/history/pages/History.tsx +69 -0
  55. package/src/history/pages/index.tsx +69 -0
  56. package/src/history/types.ts +29 -0
  57. package/src/history/utils/groupByDay.ts +47 -0
  58. package/src/index.ts +9 -0
  59. package/src/shared/components/TokenSummary/index.tsx +50 -0
  60. package/dist/_types/auth/pages/WalletSelection.d.ts +0 -2
  61. package/dist/_types/auth/pages/WalletSelection.d.ts.map +0 -1
  62. package/src/auth/pages/WalletSelection.tsx +0 -61
@@ -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/pages/SignUp/Passkey.tsx","../src/auth/pages/SignUp/index.tsx","../src/auth/pages/Verifying.tsx","../src/auth/pages/WalletSelection.tsx","../src/auth/index.tsx","../src/auth/authStoreSlice.ts","../src/store.ts","../src/connector.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","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}\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 // 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","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 { Button, Text } from '@zerodev/react-ui'\nimport { type ReactNode, 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 { SignUpPasskey } from './Passkey'\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\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 }}\n >\n {error !== null && (\n <div className=\"zd:flex zd:items-center zd:justify-center zd:h-full\">\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 <div\n className={`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 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 { ListItem, ListItemIcon, PoweredBy, Text } from '@zerodev/react-ui'\nimport { useConnect } from 'wagmi'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function WalletSelection() {\n const { goToStep } = useAuth()\n const { connect, connectors, isPending } = useConnect()\n\n const externalConnectors = connectors.filter((c) => c.id !== 'zerodev-wallet')\n\n const handleSelect = (connector: (typeof connectors)[number]) => {\n connect(\n { connector },\n {\n onSuccess: () => {\n goToStep(null)\n },\n },\n )\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <Text className=\"zd:text-h2 zd:text-center\">Select your wallet</Text>\n\n <div className=\"zd:flex zd:flex-col zd:gap-2\">\n {externalConnectors.length === 0 ? (\n <Text className=\"zd:text-center\">\n No wallets detected. Install a browser wallet extension to\n continue.\n </Text>\n ) : (\n externalConnectors.map((connector) => (\n <ListItem\n key={connector.uid}\n title={connector.name}\n icon={\n connector.icon ? (\n <img\n src={connector.icon}\n alt=\"\"\n className=\"zd:w-6 zd:h-6\"\n />\n ) : (\n <ListItemIcon name=\"walletOutline\" />\n )\n }\n disabled={isPending}\n onClick={() => handleSelect(connector)}\n className=\"zd:rounded-3xl\"\n />\n ))\n )}\n </div>\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 { WalletSelection } from './pages/WalletSelection'\nimport type { AuthStep } from './types'\nimport { hasMagicLinkCodeInUrl, stripMagicLinkCodeFromUrl } from './utils/url'\n\nconst TITLE_BY_STEP: Partial<Record<AuthStep, string>> = {\n 'wallet-selection': 'Choose your wallet',\n}\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 'wallet-selection':\n return <WalletSelection />\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 const title = step ? TITLE_BY_STEP[step] : undefined\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 // Some elements in SignUp need to go from edge to edge.\n // No vertical padding; we set px-0 so we can fully control this padding.\n contentClassName={step === 'sign-up' ? 'zd:px-0' : undefined}\n topNav={\n <TopNav\n {...(goBack !== null && { onLeftButtonClick: goBack })}\n onRightButtonClick={handleClose}\n {...(title && { title })}\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"],"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","SignUpPasskey","mutation","registerPasskey","isRegisterPending","useRegisterPasskey","loginPasskey","isLoginPending","useLoginPasskey","guarded","run","SignUpRoot","highlightAgreement","setHighlightAgreement","agreed","SignUpDivider","label","SignUpDefault","props","SignUp","getCodeFromUrl","Verifying","hasVerifiedRef","verifyMagicLink","isVerificationLoading","useVerifyMagicLink","WalletSelection","connect","connectors","useConnect","externalConnectors","handleSelect","TITLE_BY_STEP","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","id","r","active","waitForAuthFlow","resolve","reject","unsub","zeroDevWallet","params","baseFactory","baseZeroDevWallet","wagmiConfig","connectParams","NotAuthenticatedError"],"mappings":"kRAAAA,EAAe,6OCAfC,EAAe,iPCAfC,EAAe,2OCAfC,EAAe,iPCSTC,EAA+C,CACnD,MAAOJ,EACP,QAASC,EACT,KAAMC,EACN,QAASC,CACX,EASO,SAASE,EAAa,CAC3B,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,CACF,EAAsB,CACpB,OACEC,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GAAG,+CAAgDF,CAAS,EAEvE,SAAA,CAAAG,EAAAA,IAAC,MAAA,CACC,IAAKR,EAAaE,CAAS,EAC3B,IAAKA,EACL,UAAU,6CAAA,CAAA,EAEZI,EAAAA,KAAC,MAAA,CAAI,UAAU,+CACb,SAAA,CAAAE,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,mDACb,SAAAN,EACH,EACAK,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,wCACb,SAAAL,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CCrCO,SAASM,GAAwB,CAEtC,MAAMC,EADSC,EAAAA,UAAA,EACU,WAAW,KAAMC,GAAMA,EAAE,KAAO,gBAAgB,EACzE,GAAI,CAACF,GAAa,EAAE,gBAAiBA,GACnC,MAAM,IAAI,MAAM,2DAA2D,EAG7E,OAAOA,EAAU,YAAA,CACnB,CChBO,SAASG,GAAU,CACxB,MAAMC,EAAQL,EAAA,EAERM,EAAOC,EAAAA,SAASF,EAAQG,GAAUA,EAAM,KAAK,IAAI,EACjDC,EAAcF,EAAAA,SAASF,EAAQG,GAAUA,EAAM,KAAK,WAAW,EAC/DE,EAAQH,EAAAA,SAASF,EAAQG,GAAUA,EAAM,KAAK,KAAK,EACnDG,EAAQJ,EAAAA,SAASF,EAAQG,GAAUA,EAAM,KAAK,KAAK,EACnDI,EAA4BL,EAAAA,SAChCF,EACCG,GAAUA,EAAM,KAAK,yBAAA,EAExB,MAAO,CACL,KAAAF,EACA,MAAAI,EACA,MAAAC,EACA,0BAAAC,EACA,SAAUP,EAAM,SAAA,EAAW,KAAK,SAChC,OAAQI,EAAY,OAAS,EAAIJ,EAAM,SAAA,EAAW,KAAK,OAAS,KAChE,MAAOA,EAAM,SAAA,EAAW,KAAK,MAC7B,SAAUA,EAAM,SAAA,EAAW,KAAK,SAChC,cAAeA,EAAM,SAAA,EAAW,KAAK,cACrC,gBAAiBA,EAAM,SAAA,EAAW,KAAK,eAAA,CAE3C,CCpBO,SAASQ,GAAoB,CAClC,KAAM,CAAE,MAAAH,EAAO,cAAAI,CAAA,EAAkBV,EAAA,EAC3B,CAAE,YAAaW,EAAe,UAAWC,CAAA,EAC7CC,EAAAA,iBAAA,EAEI,CAACC,EAAwBC,CAAyB,EAAIC,EAAAA,SAAS,EAAE,EACjEC,EAAYH,GAA0B,GAAK,CAACF,EAElDM,EAAAA,UAAU,IAAM,CACd,GAAIJ,GAA0B,EAAG,OAEjC,MAAMK,EAAQ,YAAY,IAAM,CAC9BJ,EAA2BK,GAAS,KAAK,IAAI,EAAGA,EAAO,CAAC,CAAC,CAC3D,EAAG,GAAI,EAEP,MAAO,IAAM,CACX,cAAcD,CAAK,CACrB,CACF,EAAG,CAACL,CAAsB,CAAC,EAE3B,MAAMO,EAAe,SAAY,CAC/B,GAAI,GAACf,GAAS,CAACW,GAEf,GAAI,CACF,KAAM,CAAE,MAAAV,EAAO,0BAAAC,CAAA,EAA8B,MAAMG,EAAc,CAC/D,MAAAL,CAAA,CACD,EACDI,EAAc,CAAE,MAAAH,EAAO,0BAAAC,EAA2B,EAClDO,EAA0B,EAAE,CAC9B,MAAQ,CAER,CACF,EAEA,OACEvB,EAAAA,KAAA8B,WAAA,CACE,SAAA,CAAA9B,EAAAA,KAAC,MAAA,CAAI,UAAU,2DACb,SAAA,CAAAA,EAAAA,KAACL,EAAA,CACC,UAAU,OACV,MAAO;AAAA,yBACR,SAAA,CAAA,6BAC4B,UAC1BQ,EAAAA,KAAA,CAAK,GAAG,OAAO,UAAU,sBACvB,SAAAW,EACH,EACC;AAAA,EAAK,qDAAA,CAAA,CAAA,QAGP,MAAA,CAAI,UAAU,+BACb,SAAAd,EAAAA,KAACG,OAAA,CAAK,UAAU,iBAAiB,SAAA,CAAA,wBACT,IACtBD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,SAAU,CAACuB,EACX,QAASI,EACT,UAAU,uFAET,SAAAJ,EACG,SACA,aAAaH,CAAsB,IAAIA,IAA2B,EAAI,SAAW,SAAS,EAAA,CAAA,CAChG,CAAA,CACF,CAAA,CACF,CAAA,EACF,EAEApB,EAAAA,IAAC6B,EAAAA,UAAA,CAAU,UAAU,gCAAA,CAAiC,CAAA,EACxD,CAEJ,CC1EO,SAASC,GAAiC,CAC/C,OAAI,OAAO,OAAW,IAAoB,GACnC,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM,CAC/D,CAEO,SAASC,GAAkC,CAChD,GAAI,OAAO,OAAW,IAAa,OACnC,MAAMC,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACnCA,EAAI,aAAa,IAAI,MAAM,IAChCA,EAAI,aAAa,OAAO,MAAM,EAC9B,OAAO,QAAQ,aAAa,KAAM,GAAIA,EAAI,UAAU,EACtD,CCCO,SAASC,EAAY,CAC1B,MAAAtC,EAAQ,6BACR,QAAAuC,EAAU,mHACV,UAAAC,EAAY,GACZ,kBAAAC,EAAoB,EACtB,EAAqB,CACnB,KAAM,CAAE,SAAAC,EAAU,OAAAC,EAAQ,MAAAC,CAAA,EAAUjC,EAAA,EAC9BkC,EAAcF,IAAW,IAAMD,EAAS,SAAS,GAEvD,OACEvC,EAAAA,KAAA8B,WAAA,CACE,SAAA,CAAA9B,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAAE,EAAAA,IAACP,EAAA,CAAa,UAAU,QAAQ,MAAAE,EAC7B,SAAAuC,EACH,EAEApC,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAqC,SACEM,EAAAA,OAAA,CAAO,OAAO,UAAU,KAAK,YAAY,QAASD,EAAa,EAEjEJ,GACCpC,EAAAA,IAACyC,EAAAA,OAAA,CACC,OAAQN,EAAY,YAAc,UAClC,QAAS,IAAM,CACbJ,EAAA,EACAM,EAAS,SAAS,CACpB,EACA,KAAK,+BAAA,CAAA,EAGR,CAACF,GAAa,CAACC,GACdpC,EAAAA,IAACyC,EAAAA,OAAA,CAAO,OAAO,UAAU,KAAK,aAAa,QAASF,CAAA,CAAO,CAAA,CAAA,CAE/D,CAAA,EACF,EAEAvC,EAAAA,IAAC6B,EAAAA,UAAA,CAAU,UAAU,gCAAA,CAAiC,CAAA,EACxD,CAEJ,CChDA,MAAMa,GAAa,EACbC,GAAa,EACbC,GAAiB,EAEvB,SAASC,GAAYC,EAAwB,CAC3C,OAAO,KAAK,IAAIJ,GAAY,KAAK,IAAIC,GAAYG,CAAM,CAAC,CAC1D,CAOA,SAASC,GAAQ,CAAE,KAAAC,EAAM,UAAAC,GAA2B,CAClD,OACEjD,EAAAA,IAACkD,EAAAA,QAAA,CACC,cAAY,iBACZ,cAAaD,GAAa,OAC1B,UAAWlD,EAAAA,GACT,0EACAkD,GAAa,uCAAA,EAGf,SAAAjD,EAAAA,IAACC,OAAA,CAAK,UAAU,aAAc,SAAA+C,CAAA,CAAK,CAAA,CAAA,CAGzC,CAYO,SAASG,GAAU,CACxB,SAAAC,EACA,WAAAC,EACA,SAAAC,EAAW,GACX,MAAAC,EAAQ,GACR,UAAAC,EAAY,GACZ,OAAAV,EAASF,GACT,cAAea,CACjB,EAAmB,CACjB,MAAMC,EAAab,GAAYC,CAAM,EAC/Ba,EAAYC,EAAAA,QAChB,IACE,MAAM,KAAK,CAAE,OAAQF,GAAc,CAACG,EAAGC,KAAO,CAC5C,GAAI,QAAQA,CAAC,GACb,MAAOA,CAAA,EACP,EACJ,CAACJ,CAAU,CAAA,EAGP,CAACK,EAAMC,CAAO,EAAI1C,EAAAA,SAAS,EAAE,EAC7B,CAAC2B,EAAWgB,CAAY,EAAI3C,EAAAA,SAAS,EAAK,EAC1C4C,EAAWC,EAAAA,OAAyB,IAAI,EAE9C3C,EAAAA,UAAU,IAAM,OACVgC,GAAa,CAACF,KAChBc,EAAAF,EAAS,UAAT,MAAAE,EAAkB,QAEtB,EAAG,CAACZ,EAAWF,CAAQ,CAAC,EAExB9B,EAAAA,UAAU,IAAM,CACdwC,EAAStC,GAASA,EAAK,MAAM,EAAGgC,CAAU,CAAC,CAC7C,EAAG,CAACA,CAAU,CAAC,EAEf,MAAMW,EAAgBC,GAAiB,CACrC,MAAMC,EAAYD,EAAK,MAAM,EAAGZ,CAAU,EAAE,YAAA,EAC5CM,EAAQO,CAAS,EACjBnB,GAAA,MAAAA,EAAWmB,GAEPA,EAAU,SAAWb,GAEvB,WAAW,IAAM,OACfL,GAAA,MAAAA,EAAakB,IACbH,EAAAF,EAAS,UAAT,MAAAE,EAAkB,MACpB,EAAG,CAAC,CAER,EAEA,OACEtE,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,UAAU,2FACV,QAAS,IAAA,OAAM,OAAAsE,EAAAF,EAAS,UAAT,YAAAE,EAAkB,SACjC,SAAAd,EACA,cAAaG,EAEb,SAAA,CAAAzD,EAAAA,IAAC,QAAA,CACC,IAAKkE,EACL,MAAOH,EACP,SAAWS,GAAMH,EAAaG,EAAE,OAAO,KAAK,EAC5C,QAAS,IAAMP,EAAa,EAAI,EAChC,OAAQ,IAAMA,EAAa,EAAK,EAChC,UAAWP,EACX,SAAAJ,EACA,UAAU,kDACV,MAAO,CAAE,SAAU,WAAY,QAAS,CAAA,EACxC,aAAW,mBAAA,CAAA,EAEZK,EAAU,IAAKc,GACdzE,EAAAA,IAAC+C,GAAA,CAEC,KAAMgB,EAAKU,EAAI,KAAK,GAAK,GACzB,UAAW,CAAClB,GAASN,GAAawB,EAAI,QAAUV,EAAK,MAAA,EAFhDU,EAAI,EAAA,CAIZ,CAAA,CAAA,CAAA,CAGP,CC/GO,SAASC,IAAW,CACzB,KAAM,CACJ,MAAA9D,EACA,MAAAC,EACA,0BAAAC,EACA,cAAAE,EACA,gBAAA2D,EACA,SAAAtC,CAAA,EACE/B,EAAA,EACE,CAAE,YAAasE,EAAS,UAAWC,CAAA,EAAqBC,EAAAA,WAAA,EACxD,CAAE,YAAaC,EAAW,UAAAC,CAAA,EAAcC,EAAAA,aAAA,EAExC,CAACC,EAAKC,CAAM,EAAI7D,EAAAA,SAAS,EAAE,EAC3B,CAACiC,EAAO6B,CAAQ,EAAI9D,EAAAA,SAAS,EAAK,EAClC,CAAC+D,EAAoBC,CAAqB,EAAIhE,EAAAA,SAAS,EAAE,EAG/DE,EAAAA,UAAU,IAAM,CACd,GAAI6D,GAAsB,EAAG,OAE7B,MAAME,EAAW,YAAY,IAAM,CACjCD,EAAuB5D,GAAS,KAAK,IAAI,EAAGA,EAAO,CAAC,CAAC,CACvD,EAAG,GAAI,EACP,MAAO,IAAM,cAAc6D,CAAQ,CACrC,EAAG,CAACF,CAAkB,CAAC,EAEvB,MAAMG,EAAe,SAAY,CAC/B,GAAI,GAACN,EAAI,KAAA,GAAU,CAACrE,GAAS,CAACC,GAE9B,CAAAsE,EAAS,EAAK,EACd,GAAI,CACF,MAAML,EAAU,CACd,MAAAlE,EACA,KAAMqE,EAAI,KAAA,EACV,0BAAApE,CAAA,CACD,EACD6D,EAAA,EACAtC,EAAS,eAAe,CAC1B,MAAQ,CACN+C,EAAS,EAAI,CACf,EACF,EAEMK,EAAkB1B,GAAiB,CACvCoB,EAAOpB,CAAI,CACb,EAEMpC,EAAe,SAAY,CAC/B,GAAI,GAACf,GAASyE,EAAqB,GAAKR,GAExC,GAAI,CACF,KAAM,CAAE,MAAOa,EAAU,0BAA2BC,CAAA,EAClD,MAAMf,EAAQ,CAAE,MAAAhE,EAAO,EACzBI,EAAc,CACZ,MAAO0E,EACP,0BAA2BC,CAAA,CAC5B,EACDL,EAAsB,EAAE,EACxBF,EAAS,EAAK,CAChB,MAAQ,CACNA,EAAS,EAAI,CACf,CACF,EAEM7D,EAAY8D,GAAsB,GAAK,CAACR,EAE9C,OACE/E,EAAAA,KAAA8B,WAAA,CACE,SAAA,CAAA9B,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAE,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,4BAA4B,SAAA,0BAE5C,EACAH,EAAAA,KAACG,EAAAA,KAAA,CAAK,UAAU,iBAAiB,SAAA,CAAA,2CACU,IACzCD,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,sBAAuB,SAAAW,CAAA,CAAM,CAAA,CAAA,CAC/C,CAAA,EACF,EAEAZ,EAAAA,IAACmD,GAAA,CACC,WAAYsC,EACZ,SAAU,IAAML,EAAS,EAAK,EAC9B,SAAUJ,EACV,MAAAzB,EACA,UAAS,EAAA,CAAA,EAGXvD,EAAAA,IAACyC,EAAAA,OAAA,CACC,KAAK,eACL,QAAS+C,EACT,SAAU,CAACN,EAAI,QAAUF,CAAA,CAAA,QAG1B,MAAA,CAAI,UAAU,+BACb,SAAAlF,EAAAA,KAACG,OAAA,CAAK,UAAU,iBAAiB,SAAA,CAAA,wBACT,IACtBD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,SAAU,CAACuB,EACX,QAASI,EACT,UAAU,uFAET,SAAAJ,EACG,SACA,aAAa8D,CAAkB,IAAIA,IAAuB,EAAI,SAAW,SAAS,EAAA,CAAA,CACxF,CAAA,CACF,CAAA,CACF,CAAA,EACF,EAEArF,EAAAA,IAAC6B,EAAAA,UAAA,CAAU,UAAU,gCAAA,CAAiC,CAAA,EACxD,CAEJ,CCrHO,SAAS+D,GAAa,CAC3B,sBAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,UAAAC,EAAY,EACd,EAMG,CACD,MAAMC,EAAgB,CAAC,EAAEL,GAAyBC,GAElD,OACEhG,EAAAA,KAAC,MAAA,CAAI,UAAU,+CACZ,SAAA,CAAAoG,GACCpG,EAAAA,KAAC,MAAA,CACC,UAAW,0FACTmG,EACI,+BACA,iCACN,GAEA,SAAA,CAAAjG,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAAS+F,EACT,SAAWvB,GAAMwB,EAAiBxB,EAAE,OAAO,OAAO,EAClD,UAAU,2CAAA,CAAA,EAEZ1E,EAAAA,KAACG,EAAAA,KAAA,CAAK,UAAU,YAAY,SAAA,CAAA,iBACX,IACd4F,GACC7F,EAAAA,IAACC,EAAAA,KAAA,CACC,GAAG,IACH,KAAM4F,EACN,OAAO,SACP,IAAI,sBACJ,UAAU,eACX,SAAA,oBAAA,CAAA,EAIFA,GAAyBC,GAAoB,QAC7CA,GACC9F,EAAAA,IAACC,EAAAA,KAAA,CACC,GAAG,IACH,KAAM6F,EACN,OAAO,SACP,IAAI,sBACJ,UAAU,eACX,SAAA,gBAAA,CAAA,CAED,CAAA,CAEJ,CAAA,CAAA,CAAA,QAGHjE,EAAAA,UAAA,CAAA,CAAU,CAAA,EACb,CAEJ,CChEA,MAAAsE,GAAe,2OCSR,SAASC,GAAc,CAAE,UAAAvG,GAAqC,CACnE,OACEG,EAAAA,IAAC,QAAA,CACC,UAAAH,EACA,MAAO,CAAE,YAAa,OAAA,EACtB,IAAKsG,GACL,SAAQ,GACR,KAAI,GACJ,MAAK,GACL,YAAW,GACX,cAAY,OACZ,SAAU,EAAA,CAAA,CAGhB,CCHO,MAAME,EAAgBC,EAAAA,cAAyC,IAAI,EAEnE,SAASC,GAAuC,CACrD,MAAMC,EAAMC,EAAAA,WAAWJ,CAAa,EACpC,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,sDAAsD,EAExE,OAAOA,CACT,CAMO,SAASE,EAAiBC,EAAkB,CACjD,KAAM,CAAE,eAAAC,CAAA,EAAmBL,EAAA,EAC3B/E,EAAAA,UAAU,KACRoF,EAAeD,CAAO,EACf,IAAMC,EAAe,EAAK,GAChC,CAACD,EAASC,CAAc,CAAC,CAC9B,CC9BA,MAAMC,GAAc,6BACb,SAASC,EAAoBlG,EAAwB,CAC1D,OAAOiG,GAAY,KAAKjG,EAAM,KAAA,CAAM,CACtC,CCJO,SAASmG,GAAc,CAC5B,KAAM,CAAE,SAAA1E,EAAU,SAAA2E,EAAU,cAAAhG,CAAA,EAAkBV,EAAA,EACxC,CACJ,YAAA2G,EACA,gBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,SAAAhC,CAAA,EACEmB,EAAA,EACE,CAACc,EAAYC,CAAa,EAAIhG,EAAAA,SAAS,EAAE,EAEzCiG,EAAeL,IAAoB,MACnC,CAAE,YAAatC,EAAS,UAAWC,CAAA,EAAqBC,EAAAA,WAAA,EACxD,CAAE,YAAa7D,EAAe,UAAWuG,CAAA,EAC7CrG,EAAAA,iBAAA,EACIsG,EAAiB5C,GAAoB2C,EAC3Cd,EAAiBe,CAAc,EAE/B,MAAMC,EAAe,SAAY,CAC/B,GAAI,GAACL,GAAcJ,IACdH,EAAoBO,CAAU,GAC9BD,IAEL,CAAAhC,EAAS,IAAI,EACb,GAAI,CACF,MAAMuC,EAAOJ,EAAe3C,EAAU3D,EAChC,CAAE,MAAAJ,EAAO,0BAAAC,CAAA,EAA8B,MAAM6G,EAAK,CACtD,MAAON,CAAA,CACR,EACDL,EAASK,CAAU,EACnBrG,EAAc,CAAE,MAAAH,EAAO,0BAAAC,EAA2B,EAClDuB,EAASkF,EAAe,YAAc,oBAAoB,CAC5D,OAASK,EAAK,CACZxC,EACEwC,aAAe,MAAQA,EAAI,QAAU,kCAAA,CAEzC,EACF,EAEA,OACE5H,EAAAA,IAAC6H,EAAAA,MAAA,CACC,SAAS,QACT,YAAY,mBACZ,MAAOR,EACP,SAAW7C,GAAM8C,EAAc9C,EAAE,OAAO,KAAK,EAC7C,KAAK,QACL,eAAe,OACf,aAAa,QACb,SAAUyC,EACV,QAAQ,gBACR,UAAYzC,GAAM,CACZA,EAAE,MAAQ,SAAW6C,GAAc,CAACJ,GACtCS,EAAA,CAEJ,EAEC,SAAAD,EACCzH,EAAAA,IAAC,MAAA,CAAI,UAAU,4DACb,eAAC,MAAA,CAAI,UAAU,yGAAA,CAA0G,CAAA,CAC3H,EAEAA,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,SAAU,CAAC8G,EAAoBO,CAAU,GAAKF,EAC9C,UAAW,iGACTL,EAAoBO,CAAU,GAAK,CAACF,EAChC,oBACA,qCACN,GACA,QAAS,IAAMO,EAAA,EAEf,SAAA1H,EAAAA,IAAC8H,OAAA,CAAK,KAAK,eAAe,UAAU,mBAAA,CAAoB,CAAA,CAAA,CAC1D,CAAA,CAIR,CCrFO,SAASC,EAAoBH,EAAuB,CACzD,OAAMA,aAAe,MAEjBA,EAAI,OAAS,cAAgBA,EAAI,OAAS,kBAA0B,GAE5DA,EAAI,QAAQ,YAAA,EACb,SAAS,wBAAwB,EALR,EAMtC,CCAO,SAASI,GAAe,CAC7B,KAAM,CAAE,SAAA3F,CAAA,EAAa/B,EAAA,EACf,CAAE,YAAA2G,EAAa,eAAAG,EAAgB,SAAAhC,CAAA,EAAamB,EAAA,EAE5C,CAAE,YAAa0B,EAAmB,UAAAjD,CAAA,EAAckD,EAAAA,qBAAqB,CACzE,SAAU,CACR,UAAW,IAAM,CACf7F,EAAS,eAAe,CAC1B,CAAA,CACF,CACD,EACDqE,EAAiB1B,CAAS,EAE1B,MAAMmD,EAAc,SAAY,CAC9B,GAAI,CAAAlB,GACCG,IACL,CAAAhC,EAAS,IAAI,EACb,GAAI,CACF,MAAM6C,EAAkB,CAAE,SAAU,SAAU,CAChD,OAASL,EAAK,CACPG,EAAoBH,CAAG,GAC1BxC,EAASwC,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,CAAC,CAE7D,EACF,EAEA,OACE5H,EAAAA,IAACoI,EAAAA,SAAA,CACC,KAAMpI,EAAAA,IAACqI,EAAAA,aAAA,CAAa,KAAK,QAAA,CAAS,EAClC,MAAM,SACN,eAAWC,EAAAA,gBAAA,EAAgB,EAC3B,SAAUrB,EACV,QAASkB,CAAA,CAAA,CAGf,CCnCO,SAASI,GAAgB,CAC9B,KAAM,CAAE,SAAAlG,CAAA,EAAa/B,EAAA,EACf,CAAE,YAAA2G,EAAa,eAAAG,EAAgB,SAAAhC,CAAA,EAAamB,EAAA,EAE5CiC,EAAW,CACf,UAAW,IAAM,CACfnG,EAAS,eAAe,CAC1B,EACA,QAAUuF,GAAiB,CACpBG,EAAoBH,CAAG,GAC1BxC,EAASwC,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,CAAC,CAE7D,CAAA,EAEI,CAAE,OAAQa,EAAiB,UAAWC,GAC1CC,EAAAA,mBAAmB,CAAE,SAAAH,EAAU,EAC3B,CAAE,OAAQI,EAAc,UAAWC,CAAA,EAAmBC,EAAAA,gBAAgB,CAC1E,SAAAN,CAAA,CACD,EACD9B,EAAiBgC,GAAqBG,CAAc,EAEpD,MAAME,EAAWC,GAAoB,IAAM,CACrC/B,GACCG,MACLhC,EAAS,IAAI,EACb4D,EAAA,EACF,EAEA,OACElJ,EAAAA,KAAA8B,WAAA,CACE,SAAA,CAAA5B,EAAAA,IAACyC,EAAAA,OAAA,CACC,OAAO,YACP,KAAK,mBACL,SAAS,MACT,UAAS,GACT,SAAUwE,EACV,QAAS8B,EAAQ,IAAMN,EAAA,CAAiB,CAAA,CAAA,EAE1CzI,EAAAA,IAACyC,EAAAA,OAAA,CACC,OAAO,YACP,KAAK,sBACL,SAAS,MACT,UAAS,GACT,SAAUwE,EACV,QAAS8B,EAAQ,IAAMH,EAAA,CAAc,CAAA,CAAA,CACvC,EACF,CAEJ,CCnCA,SAASK,EAAW,CAClB,SAAArJ,EACA,sBAAAiG,EACA,iBAAAC,EACA,gBAAAoB,EAAkB,WACpB,EAAoB,CAClB,KAAM,CAACnB,EAAeC,CAAgB,EAAI1E,EAAAA,SAAS,EAAK,EAClD,CAAC4H,EAAoBC,CAAqB,EAAI7H,EAAAA,SAAS,EAAK,EAC5D,CAACiC,EAAO6B,CAAQ,EAAI9D,EAAAA,SAAwB,IAAI,EAIhD,CAAC2F,EAAaL,CAAc,EAAItF,EAAAA,SAAS,EAAK,EAG9C6F,EADoB,CAAC,EAAEtB,GAAyBC,IACV,CAACC,EAEvCqB,EAAiB,IAChBD,GACLgC,EAAsB,EAAI,EACnB,IAFqB,GAK9B,OACErJ,EAAAA,KAACuG,EAAc,SAAd,CACC,MAAO,CACL,YAAAY,EACA,gBAAAC,EACA,eAAAN,EACA,eAAAO,EACA,eAAAC,EACA,SAAAhC,CAAA,EAGD,SAAA,CAAA7B,IAAU,YACR,MAAA,CAAI,UAAU,sDACb,SAAAzD,EAAAA,KAAC,MAAA,CAAI,UAAU,2CACb,SAAA,CAAAE,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,4BAA4B,SAAA,iBAAc,EAC1DD,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,iCAAkC,SAAAsD,EAAM,EACxDvD,EAAAA,IAACyC,EAAAA,OAAA,CACC,OAAO,UACP,KAAK,YACL,QAAS,IAAM2C,EAAS,IAAI,CAAA,CAAA,CAC9B,CAAA,CACF,CAAA,CACF,EAIFtF,EAAAA,KAAC,MAAA,CACC,UAAW,mGACTyD,IAAU,KAAO,aAAe,EAClC,GAEA,SAAA,CAAAzD,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,6BACb,eAACoG,GAAA,CAAc,UAAU,kDAAkD,CAAA,CAC7E,EACApG,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,4BAA4B,SAAA,0BAE5C,EACAD,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,8CAA8C,SAAA,oCAAA,CAE9D,CAAA,EACF,EACAD,EAAAA,IAAC,MAAA,CAAI,UAAU,uDACZ,SAAAJ,CAAA,CACH,CAAA,EACF,EACAI,EAAAA,IAAC,MAAA,CAAI,UAAU,UACb,SAAAA,EAAAA,IAAC4F,GAAA,CACC,sBAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,iBAAmBqD,GAAW,CAC5BpD,EAAiBoD,CAAM,EACnBA,KAA8B,EAAK,CACzC,EACA,UAAWF,CAAA,CAAA,CACb,CACF,CAAA,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CAEA,SAASG,EAAc,CAAE,MAAAC,EAAQ,MAA4B,CAC3D,OACExJ,EAAAA,KAAC,MAAA,CAAI,UAAU,oDACb,SAAA,CAAAE,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,EACtDA,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,gBAAiB,SAAAqJ,EAAM,EACvCtJ,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,CAAA,EACxD,CAEJ,CAKA,SAASuJ,GAAcC,EAA0C,CAC/D,OACE1J,EAAAA,KAACmJ,EAAA,CAAY,GAAGO,EACd,SAAA,CAAAxJ,EAAAA,IAACuI,EAAA,EAAc,QACdc,EAAA,EAAc,QACdrB,EAAA,EAAa,QACbjB,EAAA,CAAA,CAAY,CAAA,EACf,CAEJ,CAEO,MAAM0C,EAAS,OAAO,OAAOR,EAAY,CAC9C,QAASM,GACT,QAAShB,EACT,OAAQP,EACR,MAAOjB,EACP,QAASsC,CACX,CAAC,EClID,SAASK,IAAgC,CACvC,OAAI,OAAO,OAAW,IAAoB,KACnC,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM,CAC/D,CAEO,SAASC,IAAY,CAC1B,KAAM,CAAE,MAAA9I,EAAO,0BAAAC,EAA2B,SAAAuB,EAAU,gBAAAsC,CAAA,EAClDrE,EAAA,EACI,CAACyD,CAAI,EAAIzC,EAAAA,SAAwBoI,EAAc,EAC/C,CAACnG,EAAO6B,CAAQ,EAAI9D,EAAAA,SAAuB,IAAI,EAG/CsI,EAAiBzF,EAAAA,OAAO,EAAK,EAC7B,CAAE,OAAQ0F,EAAiB,UAAWC,CAAA,EAC1CC,EAAAA,mBAAmB,CACjB,SAAU,CACR,UAAW,IAAM,CACfpF,EAAA,EACAtC,EAAS,eAAe,CAC1B,EACA,QAAUuF,GAAQ,CAChBxC,EAASwC,CAAG,CACd,CAAA,CACF,CACD,EAEHpG,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,EAAAoI,EAAe,SAAW,CAAC7F,GAQ/B,IAPA6F,EAAe,QAAU,GAOrB,CAAC/I,GAAS,CAACC,EAA2B,CACxCiB,EAAA,EACAM,EAAS,IAAI,EACb,MACF,CAEAwH,EAAgB,CAAE,MAAAhJ,EAAO,KAAAkD,EAAM,0BAAAjD,CAAA,CAA2B,EAC5D,EAAG,CAACD,EAAOC,EAA2BiD,EAAM8F,EAAiBxH,CAAQ,CAAC,EAGpEvC,EAAAA,KAAA8B,WAAA,CACE,SAAA,CAAA9B,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACZ,SAAA,CAAA,CAACyD,GAASuG,GACT9J,EAAAA,IAACP,EAAA,CAAa,UAAU,UAAU,MAAM,uBAAuB,SAAA,oDAAA,CAE/D,EAGD,CAAC8D,GAAS,CAACQ,GAAQ,CAAC+F,GACnBhK,OAAA8B,EAAAA,SAAA,CACE,SAAA,CAAA9B,EAAAA,KAACL,EAAA,CAAa,UAAU,QAAQ,MAAM,eAAe,SAAA,CAAA,yDAElD,KAAA,EAAG,EAAE,8DAAA,EAER,EACAO,EAAAA,IAACyC,EAAAA,OAAA,CACC,OAAO,UACP,QAAS,IAAM,CACbV,EAAA,EACAM,EAAS,SAAS,CACpB,EACA,KAAK,+BAAA,CAAA,CACP,EACF,EAGDkB,GAAS,MACRzD,EAAAA,KAAA8B,EAAAA,SAAA,CACE,SAAA,CAAA5B,MAACP,EAAA,CAAa,UAAU,QAAQ,MAAM,6BAA6B,SAAA,mHAGnE,EACAO,EAAAA,IAACyC,EAAAA,OAAA,CACC,OAAO,UACP,QAAS,IAAM,CACbV,EAAA,EACAM,EAAS,SAAS,CACpB,EACA,KAAK,+BAAA,CAAA,CACP,CAAA,CACF,CAAA,EAEJ,EAEArC,EAAAA,IAAC6B,EAAAA,UAAA,CAAU,UAAU,gCAAA,CAAiC,CAAA,EACxD,CAEJ,CC/FO,SAASmI,IAAkB,CAChC,KAAM,CAAE,SAAA3H,CAAA,EAAa/B,EAAA,EACf,CAAE,QAAA2J,EAAS,WAAAC,EAAY,UAAAlF,CAAA,EAAcmF,EAAAA,WAAA,EAErCC,EAAqBF,EAAW,OAAQ7J,GAAMA,EAAE,KAAO,gBAAgB,EAEvEgK,EAAgBlK,GAA2C,CAC/D8J,EACE,CAAE,UAAA9J,CAAA,EACF,CACE,UAAW,IAAM,CACfkC,EAAS,IAAI,CACf,CAAA,CACF,CAEJ,EAEA,OACEvC,EAAAA,KAAA8B,WAAA,CACE,SAAA,CAAA9B,EAAAA,KAAC,MAAA,CAAI,UAAU,2DACb,SAAA,CAAAE,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,4BAA4B,SAAA,qBAAkB,QAE7D,MAAA,CAAI,UAAU,+BACZ,SAAAmK,EAAmB,SAAW,EAC7BpK,EAAAA,IAACC,EAAAA,KAAA,CAAK,UAAU,iBAAiB,SAAA,sEAAA,CAGjC,EAEAmK,EAAmB,IAAKjK,GACtBH,EAAAA,IAACoI,EAAAA,SAAA,CAEC,MAAOjI,EAAU,KACjB,KACEA,EAAU,KACRH,EAAAA,IAAC,MAAA,CACC,IAAKG,EAAU,KACf,IAAI,GACJ,UAAU,eAAA,CAAA,EAGZH,EAAAA,IAACqI,EAAAA,aAAA,CAAa,KAAK,eAAA,CAAgB,EAGvC,SAAUrD,EACV,QAAS,IAAMqF,EAAalK,CAAS,EACrC,UAAU,gBAAA,EAfLA,EAAU,GAAA,CAiBlB,CAAA,CAEL,CAAA,EACF,EAEAH,EAAAA,IAAC6B,EAAAA,UAAA,CAAU,UAAU,gCAAA,CAAiC,CAAA,EACxD,CAEJ,CC/CA,MAAMyI,GAAmD,CACvD,mBAAoB,oBACtB,EAEA,SAASC,IAAgB,CACvB,OACEvK,EAAAA,IAAC,MAAA,CAAI,UAAU,sDACb,SAAAA,MAACP,EAAA,CAAa,UAAU,UAAU,MAAM,oBAAoB,SAAA,yDAAA,CAE5D,EACF,CAEJ,CAEA,SAAS+K,IAAgB,CACvB,OACExK,EAAAA,IAAC,MAAA,CAAI,UAAU,sDACb,SAAAA,MAACP,EAAA,CAAa,UAAU,UAAU,MAAM,yBAAyB,SAAA,wCAAA,CAEjE,EACF,CAEJ,CAEA,SAASgL,GACPjK,EACAkK,EACW,CACX,OAAQlK,EAAA,CACN,IAAK,UACH,OAAOkK,EAAeA,EAAA,EAAiB1K,EAAAA,IAACyJ,EAAO,QAAP,EAAe,EACzD,IAAK,qBACH,aAAQ1I,EAAA,EAAkB,EAC5B,IAAK,YACH,aAAQ2D,GAAA,EAAS,EACnB,IAAK,gBACH,aAAQiF,GAAA,EAAU,EACpB,IAAK,oBACH,aAAQY,GAAA,EAAc,EACxB,IAAK,iBACH,aAAQC,GAAA,EAAc,EACxB,IAAK,mBACH,aAAQR,GAAA,EAAgB,EAC1B,IAAK,QACH,aAAQ/H,EAAA,EAAY,EACtB,QACE,OAAO,IAAA,CAEb,CAEO,SAAS0I,GAAc,CAC5B,QAASC,EACT,KAAAC,EACA,aAAAH,EACA,KAAAI,CACF,EAUI,GAAI,CACN,KAAM,CAAE,KAAAtK,EAAM,SAAA6B,EAAU,OAAAC,EAAQ,MAAAC,CAAA,EAAUjC,EAAA,EAE1CkB,EAAAA,UAAU,IAAM,CACVhB,IAAS,MAAQsB,KACnBO,EAAS,eAAe,CAE5B,EAAG,CAAC7B,EAAM6B,CAAQ,CAAC,EAEnB,MAAM0I,EAAUN,GAAWjK,EAAMkK,CAAY,EAC7C,GAAI,CAACK,EAAS,OAAO,KAErB,MAAMC,EAAc,IAAM,CACxBjJ,EAAA,EACAQ,EAAA,EACAqI,GAAA,MAAAA,GACF,EACMjL,EAAQa,EAAO8J,GAAc9J,CAAI,EAAI,OAE3C,OACER,EAAAA,IAACiL,EAAAA,OAAA,CACE,GAAIJ,GAAQ,CAAE,KAAAA,CAAA,EAGf,UAAWrK,IAAS,UAAY,2BAA6B,OAG7D,iBAAkBA,IAAS,UAAY,UAAY,OACnD,OACER,EAAAA,IAACkL,EAAAA,OAAA,CACE,GAAI5I,IAAW,MAAQ,CAAE,kBAAmBA,CAAA,EAC7C,mBAAoB0I,EACnB,GAAIrL,GAAS,CAAE,MAAAA,CAAA,EACf,GAAIa,IAAS,WAAa,CACzB,GAAIsK,GAAQ,CAAE,KAAAA,CAAA,EACd,UAAW,SAAA,CACb,CAAA,EAIH,SAAAC,CAAA,CAAA,CAGP,CCtHA,MAAMI,EAA0B,0BAOhC,SAASC,IAAgD,CACvD,GAAI,OAAO,OAAW,IAAa,OAAO,KAC1C,GAAI,CACF,MAAMC,EAAM,OAAO,aAAa,QAAQF,CAAuB,EAC/D,GAAI,CAACE,EAAK,OAAO,KACjB,MAAMC,EAAS,KAAK,MAAMD,CAAG,EAC7B,MAAI,EAACC,GAAA,MAAAA,EAAQ,QAAS,EAACA,GAAA,MAAAA,EAAQ,2BAAkC,KAC1DA,CACT,MAAQ,CACN,OAAO,IACT,CACF,CAEA,SAASC,GAAsBC,EAAiC,CAC9D,GAAI,SAAO,OAAW,KACtB,GAAI,CACF,OAAO,aAAa,QAClBL,EACA,KAAK,UAAUK,CAAO,CAAA,CAE1B,MAAQ,CAER,CACF,CAEA,SAASC,GAA8B,CACrC,GAAI,SAAO,OAAW,KACtB,GAAI,CACF,OAAO,aAAa,WAAWN,CAAuB,CACxD,MAAQ,CAER,CACF,CAgCO,MAAMO,GAKT,CAACC,EAAKC,EAAKC,KAAY,CACzB,KAAM,CAEJ,KAAM,KACN,YAAa,CAAA,EACb,MAAO,KACP,MAAO,KACP,0BAA2B,KAG3B,WAAY,IAAM,CAChB,MAAMC,EAASV,GAAA,EACVU,GACLH,EAAKjL,IAAW,CACd,KAAM,CACJ,GAAGA,EAAM,KACT,MAAOoL,EAAO,MACd,0BAA2BA,EAAO,yBAAA,CACpC,EACA,CACJ,EAEA,SAAWtL,GAA0B,CACnCmL,EAAKjL,IAAW,CACd,KAAM,CACJ,GAAGA,EAAM,KACT,KAAAF,EACA,YACEE,EAAM,KAAK,OAAS,KAChBA,EAAM,KAAK,YACX,CAAC,GAAGA,EAAM,KAAK,YAAaA,EAAM,KAAK,IAAI,CAAA,CACnD,EACA,CACJ,EAEA,OAAQ,IAAM,CACZ,KAAM,CAAE,KAAAqL,CAAA,EAASH,EAAA,EACjB,GAAIG,EAAK,YAAY,SAAW,EAAG,OACnC,MAAMC,EAAa,CAAC,GAAGD,EAAK,WAAW,EACjCE,EAAeD,EAAW,IAAA,EAChCL,EAAKjL,IAAW,CACd,KAAM,CACJ,GAAGA,EAAM,KACT,KAAMuL,EACN,YAAaD,CAAA,CACf,EACA,CACJ,EAEA,MAAO,IAAM,CACXP,EAAA,EACAE,EAAKjL,IAAW,CACd,KAAM,CACJ,GAAGA,EAAM,KACT,KAAM,KACN,YAAa,CAAA,EACb,MAAO,KACP,MAAO,KACP,0BAA2B,IAAA,CAC7B,EACA,CACJ,EAEA,SAAWE,GAAU,CACnB+K,EAAKjL,IAAW,CACd,KAAM,CACJ,GAAGA,EAAM,KACT,MAAAE,CAAA,CACF,EACA,CACJ,EAEA,cAAe,CAAC,CAAE,MAAAC,EAAO,0BAAAC,KAAgC,CACvDyK,GAAsB,CAAE,MAAA1K,EAAO,0BAAAC,EAA2B,EAC1D6K,EAAKjL,IAAW,CACd,KAAM,CACJ,GAAGA,EAAM,KACT,MAAAG,EACA,0BAAAC,CAAA,CACF,EACA,CACJ,EAEA,gBAAiB,IAAM,CACrB2K,EAAA,EACAE,EAAKjL,IAAW,CACd,KAAM,CACJ,GAAGA,EAAM,KACT,MAAO,KACP,0BAA2B,IAAA,CAC7B,EACA,CACJ,CAAA,CAEJ,GC5JawL,GAAc,IACzBC,EAAAA,OAAA,EACEC,EAAAA,sBAAsB,CAACT,EAAKC,EAAKrL,KAAW,CAC1C,gBAAiB,CAAA,EACjB,+BAAgC,GAChC,kBAAoB8L,GAClBV,EAAKjL,IAAW,CACd,gBAAiB,CAAC,GAAGA,EAAM,gBAAiB2L,CAAO,CAAA,EACnD,EACJ,qBAAuBC,GACrBX,EAAKjL,IAAW,CACd,gBAAiBA,EAAM,gBAAgB,OAAQ6L,GAAMA,EAAE,KAAOD,CAAE,CAAA,EAChE,EACJ,qBAAsB,IAAMX,EAAI,CAAE,gBAAiB,CAAA,EAAI,EACvD,kCAAoCa,GAClCb,EAAI,CAAE,+BAAgCa,EAAQ,EAEhD,GAAGd,GAAqBC,EAAKC,CAAU,CAAA,EACvC,CACJ,ECMF,SAASa,GAAgBlM,EAAsD,CAC7E,OAAO,IAAI,QAAc,CAACmM,EAASC,IAAW,CAC5C,MAAMC,EAAQrM,EAAM,UACjBG,GAAUA,EAAM,KAAK,KACrBF,GAAS,CACJA,IAAS,iBACXoM,EAAA,EACAF,EAAA,GACSlM,IAAS,OAGlBoM,EAAA,EACAD,EAAO,IAAI,MAAM,qBAAqB,CAAC,EAE3C,CAAA,CAEJ,CAAC,CACH,CAEO,SAASE,GACdC,EACmB,CACnB,MAAMC,EAAcC,EAAAA,cAAkBF,CAAM,EACtCvM,EAAQ2L,GAAA,EAEd,OAAQe,GAAgB,CACtB,MAAM9M,EAAY4M,EAAYE,CAAW,EAEzC,MAAO,CACL,GAAG9M,EAEH,MAAM,QAAQ+M,EAAe,CAS3B,GAAI,CACF,OAAO,MAAM/M,EAAU,QAAQ+M,CAAa,CAC9C,OAAS3J,EAAO,CACd,GACE2J,GAAA,MAAAA,EAAe,gBACf,EAAE3J,aAAiB4J,EAAAA,uBAEnB,MAAM5J,EAGR,GAAIhD,EAAM,SAAA,EAAW,KAAK,OAAS,KACjC,MAAM,IAAI,MAAM,+BAA+B,EAGjD,OAAAA,EAAM,SAAA,EAAW,KAAK,SAAS,SAAS,EACxC,MAAMkM,GAAgBlM,CAAK,EACpBJ,EAAU,QAAQ+M,CAAa,CACxC,CACF,EAEA,MAAM,YAAa,OACjB,OAAM9I,EAAAjE,EAAU,aAAV,YAAAiE,EAAA,KAAAjE,IACNI,EAAM,SAAA,EAAW,KAAK,MAAA,CACxB,EAEA,MAAM,OAAQ,OACZ,OAAM6D,EAAAjE,EAAU,QAAV,YAAAiE,EAAA,KAAAjE,IAKF,SAAO,OAAW,MAGtBI,EAAM,SAAA,EAAW,KAAK,WAAA,CA0CxB,EAEA,aAAc,CACZ,OAAOA,CACT,CAAA,CAEJ,CACF"}
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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"}