@latticexyz/entrykit 2.2.12-entrykit-9d16d7a4d5dde17d31463970d3359bc9faa08d70 → 2.2.12-entrykit-edbfe6b0bdbfa5bc9388d00bd1237079b77b9b98

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/Modal.tsx","../../src/ui/Shadow.tsx","../../src/ui/FrameProvider.tsx","../../src/useTheme.ts","../../src/EntryKitConfigProvider.tsx","../../src/usePasskeyConnector.ts","../../src/useAccountModal.ts","../../src/AccountModal.tsx","../../src/AccountModalContent.tsx","../../src/onboarding/ConnectWallet.tsx","../../src/ui/Button.tsx","../../src/icons/PendingIcon.tsx","../../src/icons/Logo.tsx","../../src/useAppInfo.ts","../../src/usePreloadImage.tsx","../../src/AppInfo.tsx","../../src/onboarding/Steps.tsx","../../src/onboarding/ConnectedWallet.tsx","../../src/AccountModalSection.tsx","../../src/useENS.ts","../../src/ui/TruncatedHex.tsx","../../src/ErrorNotice.tsx","../../src/useAppAccountClient.ts","../../src/onboarding/store.ts","../../src/getAppSigner.ts","../../src/getAppAccountClient.ts","../../src/onboarding/useSetupAppAccount.ts","../../src/paymaster.ts","../../src/onboarding/SetupAppAccount.tsx","../../src/useRecord.ts","../../src/onboarding/useAllowance.ts","../../src/onboarding/useClaimGasPass.ts","../../src/icons/EthIcon.tsx","../../src/formatBalance.ts","../../src/ui/Balance.tsx","../../src/onboarding/ClaimGasPass.tsx","../../src/onboarding/useSpender.ts","../../src/onboarding/useDelegation.ts","../../src/onboarding/useSteps.tsx","../../src/onboarding/ConnectedSteps.tsx","../../src/AccountModalErrorBoundary.tsx","../../src/icons/IconSVG.tsx","../../src/icons/CloseIcon.tsx","../../src/EntryKitProvider.tsx","../../src/AccountButton.tsx","../../src/AccountName.tsx","../../src/usePreparedAppAccountClient.ts"],"sourcesContent":["import { ReactNode } from \"react\";\nimport { Root as DialogRoot, DialogPortal, DialogContent } from \"@radix-ui/react-dialog\";\nimport { Shadow } from \"./Shadow\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n};\n\nexport function Modal({ open, onOpenChange, children }: Props) {\n return (\n <DialogRoot open={open} onOpenChange={onOpenChange}>\n {/* This intentionally does not use `<DialogTrigger>` because it doesn't play nicely with `<Shadow>` trigger (our primary use case). */}\n <DialogPortal>\n <Shadow mode=\"modal\">\n {/**\n * This intentionally does not use `<DialogOverlay>` due to an issue it causes with scrolling the modal contents.\n * See https://github.com/radix-ui/primitives/issues/1159#issuecomment-1105320294\n */}\n <div\n className={twMerge(\n \"fixed inset-0\",\n \"bg-neutral-700/50 dark:bg-neutral-900/75\",\n \"animate-in animate-duration-500 fade-in\",\n )}\n />\n <div\n className={twMerge(\n \"fixed inset-0\",\n \"grid place-items-end sm:place-items-center overflow-y-auto\",\n \"animate-in animate-duration-200 fade-in slide-in-from-bottom-4\",\n )}\n >\n <DialogContent\n className=\"outline-none w-full sm:max-w-screen-sm\"\n // TODO description\n aria-describedby={undefined}\n >\n {children}\n </DialogContent>\n </div>\n </Shadow>\n </DialogPortal>\n </DialogRoot>\n );\n}\n","import { CSSProperties, HTMLProps, ReactNode, forwardRef, useEffect, useRef, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport css from \"tailwindcss/tailwind.css?inline\";\nimport { useResizeObserver } from \"usehooks-ts\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { FrameProvider } from \"./FrameProvider\";\nimport { useTheme } from \"../useTheme\";\n\nexport type Props = {\n mode: \"modal\" | \"child\";\n children: ReactNode;\n};\n\nfunction Resizer({\n onSize,\n ...props\n}: {\n onSize: (size: { width: number | undefined; height: number | undefined }) => void;\n} & HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement | null>(null);\n useResizeObserver({ ref, onResize: onSize });\n return <div ref={ref} {...props} style={{ ...props.style, display: \"inline-block\" }} />;\n}\n\n// TODO: make a container inside the iframe that is at least the size of the window, render content into that so we can correctly measure size relative to window\n// otherwise as the iframe shrinks, the measurement will be based on that shrunk value and it'll never get bigger, only smaller\n\nexport const Shadow = forwardRef<HTMLIFrameElement, Props>(function Shadow({ mode, children }, forwardedRef) {\n const frameRef = useRef<HTMLIFrameElement | null>(null);\n const [loaded, setLoaded] = useState(false);\n const frame = loaded ? frameRef.current : null;\n\n const [frameSize, setFrameSize] = useState<{ width: number | undefined; height: number | undefined }>({\n width: undefined,\n height: undefined,\n });\n\n const frameDocument = frame?.contentDocument;\n const theme = useTheme();\n useEffect(() => {\n if (frameDocument) {\n frameDocument.body.setAttribute(\"data-theme\", theme);\n }\n }, [frameDocument, theme]);\n\n const frameStyle: CSSProperties =\n mode === \"modal\"\n ? {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100vw\",\n height: \"100vh\",\n zIndex: \"2147483646\",\n }\n : frameSize.width && frameSize.height\n ? {\n all: \"unset\",\n display: \"inline-block\",\n width: `${frameSize.width}px`,\n height: `${frameSize.height}px`,\n }\n : {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100vw\",\n height: \"100vh\",\n opacity: 0,\n pointerEvents: \"none\",\n };\n\n return (\n <iframe\n ref={mergeRefs([forwardedRef, frameRef])}\n style={frameStyle}\n onLoad={() => setLoaded(true)}\n srcDoc=\"<!doctype html><title>…</title>\"\n >\n {frameDocument\n ? ReactDOM.createPortal(\n <FrameProvider frame={frame}>\n {/*\n * TODO: make this the size of the outer window so that any container-based resizing in iframe\n * is done from that rather than the potentially-small size of this iframe\n */}\n <div>{mode === \"modal\" ? children : <Resizer onSize={setFrameSize}>{children}</Resizer>}</div>\n <style dangerouslySetInnerHTML={{ __html: css }} />\n </FrameProvider>,\n frameDocument.body,\n )\n : null}\n </iframe>\n );\n});\n","import { createContext, useContext, type ReactNode } from \"react\";\n\ntype ContextValue = {\n readonly frame: HTMLIFrameElement;\n};\n\n/** @internal */\nconst Context = createContext<ContextValue | null>(null);\n\nexport type Props = {\n frame: HTMLIFrameElement;\n children?: ReactNode;\n};\n\nexport function FrameProvider({ frame, children }: Props) {\n const value = useContext(Context);\n if (value) throw new Error(\"`FrameProvider` can only be used once.\");\n return <Context.Provider value={{ frame }}>{children}</Context.Provider>;\n}\n\nexport function useFrame(): ContextValue {\n const value = useContext(Context);\n if (!value) throw new Error(\"`useFrame` can only be used within a `FrameProvider`.\");\n return value;\n}\n","import { useMediaQuery } from \"usehooks-ts\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useTheme() {\n const { theme: initialTheme } = useEntryKitConfig();\n const darkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\n const theme = initialTheme ?? (darkMode ? \"dark\" : \"light\");\n return theme;\n}\n","import \"@rainbow-me/rainbowkit/styles.css\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { RainbowKitProvider, lightTheme, midnightTheme } from \"@rainbow-me/rainbowkit\";\nimport { EntryKitConfig } from \"./config\";\nimport { usePasskeyConnector } from \"./usePasskeyConnector\";\n\n/** @internal */\nconst Context = createContext<EntryKitConfig | null>(null);\n\nexport type Props = {\n config: EntryKitConfig;\n children?: ReactNode;\n};\n\nexport function EntryKitConfigProvider({ config, children }: Props) {\n const currentConfig = useContext(Context);\n if (currentConfig) throw new Error(\"`EntryKitProvider` can only be used once.\");\n\n // ensure we have passkey connector configured\n usePasskeyConnector();\n\n return (\n <RainbowKitProvider\n initialChain={config.chainId}\n appInfo={{\n appName: config.appInfo?.name,\n // TODO: learn more and disclaimer\n }}\n theme={\n config.theme === \"light\"\n ? lightTheme({ borderRadius: \"none\" })\n : config.theme === \"dark\"\n ? midnightTheme({ borderRadius: \"none\" })\n : {\n lightMode: lightTheme({ borderRadius: \"none\" }),\n darkMode: midnightTheme({ borderRadius: \"none\" }),\n }\n }\n >\n <Context.Provider value={config}>{children}</Context.Provider>\n </RainbowKitProvider>\n );\n}\n\nexport function useEntryKitConfig(): EntryKitConfig {\n const config = useContext(Context);\n if (!config) throw new Error(\"`useEntryKitConfig` can only be used within a `EntryKitProvider`.\");\n return config;\n}\n","import { useConnectors } from \"wagmi\";\nimport { PasskeyConnector, passkeyConnector } from \"./passkey/passkeyConnector\";\n\nexport function usePasskeyConnector(): PasskeyConnector {\n const connectors = useConnectors();\n const connector = connectors.find((c) => c.type === passkeyConnector.type);\n if (!connector) {\n // TODO: provide link to instructions\n throw new Error(\n \"Could not find passkey connector. Did you configure Wagmi with the EntryKit passkey connector or passkey wallet?\",\n );\n }\n return connector as never;\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useStore } from \"zustand\";\nimport { createStore } from \"zustand/vanilla\";\n\nconst store = createStore(() => ({ open: false }));\n\nexport type UseAccountModalResult = {\n readonly accountModalOpen: boolean;\n readonly openAccountModal: () => void;\n readonly closeAccountModal: () => void;\n readonly toggleAccountModal: (open: boolean) => void;\n};\n\nexport function useAccountModal(): UseAccountModalResult {\n const accountModalOpen = useStore(store, (state) => state.open);\n\n const openAccountModal = useCallback(() => {\n store.setState({ open: true });\n }, []);\n\n const closeAccountModal = useCallback(() => {\n store.setState({ open: false });\n }, []);\n\n const toggleAccountModal = useCallback((open: boolean) => {\n store.setState({ open: open });\n }, []);\n\n return useMemo(\n () => ({\n accountModalOpen,\n openAccountModal,\n closeAccountModal,\n toggleAccountModal,\n }),\n [accountModalOpen, openAccountModal, closeAccountModal, toggleAccountModal],\n );\n}\n","import { Modal } from \"./ui/Modal\";\nimport { useAccountModal } from \"./useAccountModal\";\nimport { twMerge } from \"tailwind-merge\";\nimport { AccountModalContent } from \"./AccountModalContent\";\nimport { AccountModalErrorBoundary } from \"./AccountModalErrorBoundary\";\nimport { DialogClose, DialogTitle } from \"@radix-ui/react-dialog\";\nimport { CloseIcon } from \"./icons/CloseIcon\";\n\nexport function AccountModal() {\n const { accountModalOpen, toggleAccountModal } = useAccountModal();\n return (\n <Modal open={accountModalOpen} onOpenChange={toggleAccountModal}>\n {/* TODO: move this into `<Modal>` props? */}\n <DialogTitle className=\"sr-only\">Connect with EntryKit</DialogTitle>\n {accountModalOpen ? (\n <div\n className={twMerge(\n \"relative flex flex-col min-h-[20rem] border-t sm:border\",\n \"bg-neutral-100 text-neutral-700 border-neutral-300\",\n \"dark:bg-neutral-800 dark:text-neutral-300 dark:border-neutral-700 dark:divide-neutral-700\",\n \"links:font-medium links:underline links:underline-offset-4\",\n \"links:text-black dark:links:text-white\",\n \"links:decoration-neutral-300 dark:links:decoration-neutral-500 hover:links:decoration-orange-500\",\n )}\n >\n <AccountModalErrorBoundary>\n <AccountModalContent />\n </AccountModalErrorBoundary>\n\n <div className=\"absolute top-0 right-0\">\n <DialogClose\n className={twMerge(\n \"pointer-events-auto leading-none p-1 transition\",\n \"text-neutral-400 hover:text-neutral-600\",\n \"dark:text-neutral-500 dark:hover:text-neutral-400\",\n )}\n title=\"Close\"\n >\n <CloseIcon className=\"m-0\" />\n </DialogClose>\n </div>\n </div>\n ) : null}\n </Modal>\n );\n}\n","import { useConnectorClient } from \"wagmi\";\nimport { ConnectWallet } from \"./onboarding/ConnectWallet\";\nimport { ConnectedSteps } from \"./onboarding/ConnectedSteps\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function AccountModalContent() {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n\n return <ConnectedSteps userClient={userClient.data} />;\n}\n","import { useAccount } from \"wagmi\";\nimport { Button } from \"../ui/Button\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { useConnectModal } from \"@rainbow-me/rainbowkit\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { usePasskeyConnector } from \"../usePasskeyConnector\";\nimport { Logo } from \"../icons/Logo\";\nimport { AppInfo } from \"../AppInfo\";\n\nexport function ConnectWallet() {\n const userAccount = useAccount();\n const { accountModalOpen } = useAccountModal();\n const { openConnectModal, connectModalOpen } = useConnectModal();\n\n const passkeyConnector = usePasskeyConnector();\n const createPasskey = useMutation({\n mutationKey: [\"createPasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: async () => {\n return await passkeyConnector.createPasskey();\n },\n });\n\n return (\n <>\n <div className=\"flex-grow grid place-items-center p-6\">\n <div className=\"flex flex-col gap-6\">\n <div className=\"p-4\">\n {/* TODO: render appImage if available? */}\n <AppInfo />\n </div>\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col\">\n <Button\n className=\"self-auto flex justify-center\"\n pending={createPasskey.status === \"pending\"}\n onClick={() => createPasskey.mutate()}\n >\n Create account\n </Button>\n {/* TODO: better error styles */}\n {createPasskey.status === \"error\" ? (\n <div className=\"bg-red-100 text-red-700 text-sm p-2 animate-in animate-duration-200 fade-in\">\n {createPasskey.error.message}\n </div>\n ) : null}\n </div>\n <Button\n className=\"self-auto flex justify-center text-sm py-1\"\n variant=\"secondary\"\n pending={userAccount.status === \"connecting\"}\n // TODO: figure out how to prevent this from switching chains after connecting\n onClick={openConnectModal}\n >\n Connect with passkey or wallet\n </Button>\n </div>\n <a\n href=\"https://mud.dev\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"self-center p-2 flex items-center justify-center gap-1.5 text-sm\"\n >\n <span className=\"block w-4 h-4\">\n <Logo className=\"w-full h-full text-orange-500 dark:bg-neutral-800\" />\n </span>\n <span>Powered by MUD</span>\n </a>\n </div>\n </div>\n </>\n );\n}\n","import { ButtonHTMLAttributes, DetailedHTMLProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\n\n// TODO: add support for async onClick, where pending is enabled automatically\n\ntype ButtonClassNameOptions = {\n variant?: \"primary\" | \"secondary\";\n pending?: boolean;\n};\n\nconst buttonClassName = ({ variant = \"primary\", pending = false }: ButtonClassNameOptions = {}) =>\n twMerge(\n \"group self-center leading-none outline-none border border-transparent ring-2 ring-transparent focus:ring-orange-500 focus:border-transparent transition\",\n \"aria-disabled:pointer-events-none aria-busy:pointer-events-none\",\n \"p-[1em] font-semibold\",\n {\n primary: twMerge(\n \"bg-neutral-900 text-white hover:bg-neutral-700 active:bg-neutral-600 aria-disabled:bg-neutral-200 aria-disabled:text-neutral-400\",\n // eslint-disable-next-line max-len\n \"dark:bg-neutral-100 dark:text-black dark:hover:bg-neutral-200 dark:active:bg-neutral-300 dark:aria-disabled:bg-neutral-400 dark:aria-disabled:text-neutral-600\",\n pending && \"dark:bg-neutral-700 dark:text-neutral-400\",\n ),\n secondary: twMerge(\n // eslint-disable-next-line max-len\n \"text-black border-neutral-400 hover:bg-neutral-200 hover:border-neutral-500 active:bg-neutral-300 active:border-neutral-600 aria-disabled:text-neutral-400 aria-disabled:border-neutral-300\",\n // eslint-disable-next-line max-len\n \"dark:text-white dark:border-neutral-400 dark:hover:bg-neutral-700 dark:hover:border-neutral-300 dark:active:bg-neutral-600 dark:active:border-neutral-200 dark:aria-disabled:text-neutral-500 dark:aria-disabled:border-neutral-600\",\n ),\n }[variant],\n );\n\nexport type ButtonProps = {\n pending?: boolean;\n variant?: ButtonClassNameOptions[\"variant\"];\n};\n\nexport type Props = ButtonProps & DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;\n\nexport const Button = ({ pending, variant, type, className, children, disabled, ...props }: Props) => {\n return (\n <button\n type={type || \"button\"}\n className={twMerge(buttonClassName({ variant, pending }), className)}\n aria-busy={pending}\n aria-disabled={disabled}\n disabled={disabled || pending}\n {...props}\n >\n <span className=\"grid grid-cols-[1fr_auto_1fr] gap-2\">\n <span className=\"flex items-center justify-end text-[.75em]\">\n <span className=\"transition opacity-0 translate-x-2 group-aria-busy:opacity-100 group-aria-busy:translate-x-0 duration-100 group-aria-busy:duration-300\">\n <PendingIcon />\n </span>\n </span>\n <span>{children}</span>\n </span>\n </button>\n );\n};\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function PendingIcon({ className, ...props }: Props) {\n return (\n <svg\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em] animate-spin\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function Logo({ className, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n fill=\"currentColor\"\n shapeRendering=\"crispEdges\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {/* eslint-disable-next-line max-len */}\n <path d=\"M0 0h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm2-1h1v1H7zm0 1h1v1H7zM6 7h1v1H6zm1-2h1v1H7zm0-1h1v1H7zm0-1h1v1H7z\" />\n <path\n d=\"M2 2h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm1-3h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm0 1h1v1H5zm0 1h1v1H5zm0 1h1v1H5zM4 5h1v1H4zM3 5h1v1H3z\"\n opacity=\".5\"\n />\n <path d=\"M7 2h1v1H7zm0-1h1v1H7zM1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm1 0h1v1H6zm1 0h1v1H7z\" />\n </svg>\n );\n}\n","import { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useAppInfo() {\n const { appInfo } = useEntryKitConfig();\n\n const appName = appInfo?.name ?? document.title;\n // TODO: should origin be set in config and validated against current host?\n const appOrigin = location.host;\n const appIcon = appInfo?.icon ?? document.querySelector(\"link[rel~='icon']\")?.getAttribute(\"href\") ?? \"/favico.ico\";\n const appImage = appInfo?.image;\n\n return { appName, appOrigin, appIcon, appImage };\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nexport function usePreloadImage(url: string | undefined) {\n return useQuery({\n enabled: !!url,\n retry: false,\n retryOnMount: false,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n queryKey: [url],\n queryFn: () =>\n new Promise<InstanceType<typeof Image>>((resolve, reject) => {\n if (!url) throw new Error(\"usePreloadImage: Must provide `url` to preload image.\");\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`usePreloadImage: Could not load image.\\n\\n\\tURL: ${url}`));\n image.src = url;\n }),\n });\n}\n","import { Logo } from \"./icons/Logo\";\nimport { useAppInfo } from \"./useAppInfo\";\nimport { usePreloadImage } from \"./usePreloadImage\";\n\nexport function AppInfo() {\n const { appName, appOrigin, appIcon } = useAppInfo();\n\n const { data: hasAppIcon, isLoading: appIconLoading } = usePreloadImage(appIcon);\n\n return (\n <div className=\"flex-grow flex flex-col items-center justify-center gap-2\">\n <div className=\"w-16 h-16 m-2\">\n {!appIconLoading ? (\n hasAppIcon ? (\n <img src={appIcon} className=\"w-full h-full object-cover\" />\n ) : (\n // TODO: swap with favicon\n <Logo className=\"w-full h-full text-orange-500 dark:bg-neutral-800\" />\n )\n ) : null}\n </div>\n <div className=\"flex flex-col gap-1 items-center justify-center\">\n <div className=\"text-2xl\">{appName}</div>\n <div className=\"text-sm font-mono text-neutral-400\">{appOrigin}</div>\n </div>\n </div>\n );\n}\n","import { Step } from \"./common\";\nimport { useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n steps: readonly Step[];\n};\n\nexport function Steps({ steps }: Props) {\n if (!steps.length) throw new Error(\"No steps.\");\n\n const [selectedStepId, setSelectedStepId] = useState<null | string>(null);\n const nextStep = steps.find((step) => step.content != null && !step.isComplete);\n const completedSteps = steps.filter((step) => step.isComplete);\n const activeStep =\n (selectedStepId != null ? steps.find((step) => step.id === selectedStepId) : null) ??\n nextStep ??\n (completedSteps.length < steps.length ? completedSteps.at(-1) : null) ??\n steps.at(0)!;\n\n return (\n <>\n <div className=\"flex items-center justify-center p-2\">\n {steps\n .filter((step) => step.id !== \"finalize\")\n .map((step) => (\n <button\n key={step.id}\n type=\"button\"\n title={step.label}\n disabled={!step.content}\n className=\"outline-none p-2.5 -my-2.5 hover:enabled:brightness-125 transition\"\n onClick={() => setSelectedStepId(step.id)}\n >\n <span\n className={twMerge(\n \"block w-2.5 h-2.5 rounded-full\",\n step.id === nextStep?.id ? \"bg-orange-500\" : step.isComplete ? \"bg-amber-700\" : \"bg-gray-300\",\n step.id === activeStep.id ? \"ring-4 ring-orange-500/20\" : null,\n )}\n ></span>\n <span className=\"sr-only\">{step.label}</span>\n </button>\n ))}\n </div>\n\n <div className=\"outline-none flex-grow flex flex-col\">{activeStep.content}</div>\n </>\n );\n}\n","import { useDisconnect } from \"wagmi\";\nimport { AccountModalSection } from \"../AccountModalSection\";\nimport { useENS } from \"../useENS\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { Button } from \"../ui/Button\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { ErrorNotice } from \"../ErrorNotice\";\nimport { Hex } from \"viem\";\n\nexport type Props = {\n userAddress: Hex;\n};\n\nexport function ConnectedWallet({ userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending, error: disconnectError } = useDisconnect();\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\n return (\n <>\n <AccountModalSection>\n <div className=\"text-lg font-medium\">Your wallet</div>\n <div className=\"space-y-4\">\n <p>\n Hello,{\" \"}\n {ens.name ? (\n <span className=\"font-medium\">{ens.name}</span>\n ) : (\n <span className=\"text-sm font-mono font-medium\">\n <TruncatedHex hex={userAddress} />\n </span>\n )}\n !\n </p>\n <p>\n Once signed in, your wallet address (\n <span className=\"text-sm font-mono font-medium\">\n <TruncatedHex hex={userAddress} />\n </span>\n ) will be associated with all onchain actions for this app.\n </p>\n </div>\n </AccountModalSection>\n <AccountModalSection className=\"justify-end\">\n {disconnectError ? <ErrorNotice error={disconnectError} /> : null}\n <Button\n variant=\"secondary\"\n className=\"self-stretch sm:self-start\"\n pending={disconnectIsPending}\n onClick={() => {\n closeAccountModal();\n disconnect();\n }}\n >\n Disconnect\n </Button>\n </AccountModalSection>\n </>\n );\n}\n","import { ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n className?: string;\n children: ReactNode;\n};\n\nexport function AccountModalSection({ className, children }: Props) {\n return (\n <div\n className={twMerge(\n \"flex-grow flex flex-col gap-5 px-5 pb-5\",\n \"animate-in fade-in slide-in-from-left-2\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { Hex } from \"viem\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nexport function useENS(address: Hex | undefined) {\n const normalizedAddress = address?.toLowerCase();\n return useQuery<{\n address: string | undefined;\n name: string | undefined;\n displayName: string | undefined;\n avatar: string | undefined;\n }>({\n enabled: !!normalizedAddress,\n queryKey: [\"ens\", normalizedAddress],\n initialData: {\n address: undefined,\n name: undefined,\n displayName: undefined,\n avatar: undefined,\n },\n queryFn: async () => {\n // TODO: typed response\n const data = await fetch(`https://api.ensideas.com/ens/resolve/${normalizedAddress}`).then((res) => res.json());\n return {\n address: data.address ?? undefined,\n name: data.name ?? undefined,\n displayName: data.displayName ?? undefined,\n avatar: data.avatar ?? undefined,\n };\n },\n });\n}\n","import { Hex } from \"viem\";\n\nexport type Props = {\n hex: Hex;\n};\n\nexport function TruncatedHex({ hex }: Props) {\n if (hex.length <= 10) {\n return <span title={hex}>{hex}</span>;\n }\n\n return (\n <span title={hex}>\n <span className=\"after:select-none after:content-['…']\">{hex.slice(0, 6)}</span>\n <span className=\"tracking-[-1ch] text-transparent\">{hex.slice(6, -4)}</span>\n {hex.slice(-4)}\n </span>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { BaseError, UserRejectedRequestError } from \"viem\";\n\nexport type Props = {\n title?: string;\n error?: unknown;\n};\n\nexport function ErrorNotice({ title: initialTitle, error }: Props) {\n if (!error) return null;\n // no need to let users know they rejected\n if (error instanceof BaseError && error.walk((e) => e instanceof UserRejectedRequestError) != null) {\n return null;\n }\n\n // TODO: extract title from error name or first line of error message?\n const title = initialTitle ?? \"Error\";\n\n // TODO: do something to protect against `[object Object]`\n const message =\n typeof error === \"string\" ? error : error instanceof Error ? String(error) : \"Something unexpected happened.\";\n\n // TODO: add \"report error\" link\n\n return (\n <div\n className={twMerge(\n \"text-sm border-l-4 border-red-500\",\n \"bg-red-100 text-red-900\",\n \"dark:bg-red-900 dark:text-red-50\",\n )}\n >\n <div className=\"p-3 font-semibold\">{title}</div>\n <div className=\"px-3 whitespace-break-spaces break-all max-h-32 overflow-y-scroll\">{message}</div>\n </div>\n );\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UseQueryResult, useQuery } from \"@tanstack/react-query\";\nimport { getAppAccountClient } from \"./getAppAccountClient\";\n\nexport function useAppAccountClient(\n userAddress: Address | undefined,\n): UseQueryResult<Client<Transport, Chain, Account>> {\n const { chainId, bundlerTransport, paymasterAddress, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const queryKey = [\"appAccountClient\", client?.uid, userAddress];\n return useQuery(\n client && userAddress\n ? {\n queryKey,\n queryFn: async () => {\n return await getAppAccountClient({\n worldAddress,\n userAddress,\n client,\n bundlerTransport,\n paymasterAddress,\n });\n },\n staleTime: Infinity,\n }\n : { queryKey, enabled: false },\n );\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { Address, Hex } from \"viem\";\n\nexport type State = {\n readonly appSigners: {\n readonly [key in Address]?: Hex;\n };\n};\n\nexport const store = createStore(\n persist<State>(\n () => ({\n appSigners: {},\n }),\n {\n name: \"mud:entrykit\",\n partialize: ({ appSigners }) => ({ appSigners }),\n },\n ),\n);\n\n// keep store in sync across tabs/windows via storage event\nfunction listener(event: StorageEvent) {\n if (event.key === store.persist.getOptions().name) {\n store.persist.rehydrate();\n }\n}\nwindow.addEventListener(\"storage\", listener);\n","import { Address } from \"viem\";\nimport { store } from \"./onboarding/store\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport function getAppSigner(userAddress: Address) {\n const appSignerPrivateKey =\n store.getState().appSigners[userAddress] ??\n (() => {\n const privateKey = generatePrivateKey();\n store.setState((state) => ({\n appSigners: {\n ...state.appSigners,\n [userAddress]: privateKey,\n },\n }));\n return privateKey;\n })();\n\n return privateKeyToAccount(appSignerPrivateKey);\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { getAppSigner } from \"./getAppSigner\";\nimport { toCoinbaseSmartAccount } from \"./smart-account/toCoinbaseSmartAccount\";\nimport { createSmartAccountClient } from \"permissionless\";\nimport { callFrom } from \"@latticexyz/world/internal\";\nimport { defaultClientConfig } from \"./common\";\n\nexport async function getAppAccountClient<chain extends Chain>({\n worldAddress,\n userAddress,\n client,\n bundlerTransport,\n paymasterAddress,\n}: {\n worldAddress: Address;\n userAddress: Address;\n client: Client<Transport, chain>;\n bundlerTransport: Transport;\n paymasterAddress: Address;\n}): Promise<Client<Transport, chain, Account>> {\n const appSigner = getAppSigner(userAddress);\n const account = await toCoinbaseSmartAccount({ client, owners: [appSigner] });\n\n const appAccountClient = createSmartAccountClient({\n ...defaultClientConfig,\n bundlerTransport,\n client,\n account,\n // TODO: lift out to somewhere else\n paymaster: {\n getPaymasterData: async () => ({\n paymaster: paymasterAddress,\n paymasterData: \"0x\",\n }),\n },\n // TODO: lift out to somewhere else\n userOperation: {\n estimateFeesPerGas:\n // anvil hardcodes fee returned by `eth_maxPriorityFeePerGas`\n // so we have to override it here\n // https://github.com/foundry-rs/foundry/pull/8081#issuecomment-2402002485\n client.chain.id === 31337\n ? async () => ({\n maxFeePerGas: 100_000n,\n maxPriorityFeePerGas: 0n,\n })\n : undefined,\n },\n });\n\n return appAccountClient.extend(callFrom({ worldAddress, delegatorAddress: userAddress, publicClient: client }));\n}\n","import { Address, ContractFunctionParameters, Abi } from \"viem\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { getAction } from \"viem/utils\";\nimport { sendUserOperation, waitForUserOperationReceipt } from \"viem/account-abstraction\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { ConnectedClient, unlimitedDelegationControlId, worldAbi } from \"../common\";\nimport { paymasterAbi } from \"../paymaster\";\n\nfunction defineCall<abi extends Abi | readonly unknown[]>(\n call: Omit<ContractFunctionParameters<abi>, \"address\"> & {\n to: Address;\n value?: bigint | undefined;\n },\n) {\n return call;\n}\n\nexport function useSetupAppAccount() {\n const { worldAddress, paymasterAddress } = useEntryKitConfig();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: [\"setupAppAccount\"],\n mutationFn: async ({\n userClient,\n appAccountAddress,\n registerSpender,\n registerDelegation,\n }: {\n userClient: ConnectedClient;\n appAccountAddress: Address;\n registerSpender: boolean;\n registerDelegation: boolean;\n }): Promise<void> => {\n // TODO: for non-smart accounts, collect signatures and store to be executed later?\n if (userClient.account.type !== \"smart\") {\n throw new Error(\"User account is not a smart account.\");\n }\n\n const calls = [];\n\n if (registerSpender) {\n console.log(\"registering spender\");\n calls.push(\n defineCall({\n to: paymasterAddress,\n abi: paymasterAbi,\n functionName: \"registerSpender\",\n args: [appAccountAddress],\n }),\n );\n }\n\n if (registerDelegation) {\n console.log(\"registering delegation\");\n calls.push(\n defineCall({\n to: worldAddress,\n abi: worldAbi,\n functionName: \"registerDelegation\",\n args: [appAccountAddress, unlimitedDelegationControlId, \"0x\"],\n }),\n );\n }\n\n if (!calls.length) return;\n\n const hash = await getAction(userClient, sendUserOperation, \"sendUserOperation\")({ calls });\n console.log(\"got user op hash\", hash);\n\n const receipt = await getAction(userClient, waitForUserOperationReceipt, \"waitForUserOperationReceipt\")({ hash });\n console.log(\"got user op receipt\", receipt);\n\n await queryClient.invalidateQueries({ queryKey: [\"readContract\"] });\n },\n });\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\nexport const paymasterAbi = parseAbi([\n \"error SpenderSystem_AlreadyRegistered(address spender, address user)\",\n \"error SpenderSystem_HasOwnBalance(address spender)\",\n \"function registerSpender(address spender)\",\n]);\n\nexport const paymasterConfig = defineStore({\n namespaces: {\n root: {\n namespace: \"\",\n tables: {\n Allowance: {\n schema: {\n user: \"address\",\n allowance: \"uint256\",\n },\n key: [\"user\"],\n },\n Grantor: {\n schema: {\n grantor: \"address\",\n allowance: \"uint256\",\n },\n key: [\"grantor\"],\n },\n PassHolder: {\n schema: {\n user: \"address\",\n passId: \"bytes32\",\n lastRenewed: \"uint256\",\n lastClaimed: \"uint256\",\n },\n key: [\"user\", \"passId\"],\n },\n PassConfig: {\n schema: {\n passId: \"bytes32\",\n claimAmount: \"uint256\",\n claimInterval: \"uint256\",\n validityPeriod: \"uint256\",\n grantor: \"address\",\n },\n key: [\"passId\"],\n },\n Spender: {\n schema: {\n spender: \"address\",\n user: \"address\",\n },\n key: [\"spender\"],\n },\n SystemConfig: {\n schema: {\n entryPoint: \"address\",\n },\n key: [],\n },\n },\n },\n },\n});\n\nexport const paymasterTables = paymasterConfig.namespaces.root.tables;\n","import { PendingIcon } from \"../icons/PendingIcon\";\nimport { ErrorNotice } from \"../ErrorNotice\";\nimport { AccountModalSection } from \"../AccountModalSection\";\nimport { useAppAccountClient } from \"../useAppAccountClient\";\nimport { Button } from \"../ui/Button\";\nimport { useSetupAppAccount } from \"./useSetupAppAccount\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { ConnectedClient } from \"../common\";\n\nexport type Props = {\n userClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n};\n\nexport function SetupAppAccount({ userClient, registerSpender, registerDelegation }: Props) {\n const { closeAccountModal } = useAccountModal();\n const appAccountClient = useAppAccountClient(userClient.account.address);\n const setup = useSetupAppAccount();\n\n if (appAccountClient.status === \"pending\") {\n // TODO: better loading state/message\n return (\n <AccountModalSection className=\"items-center justify-center\">\n <PendingIcon />\n </AccountModalSection>\n );\n }\n\n if (appAccountClient.status === \"error\") {\n // TODO: better error state/message\n return (\n <AccountModalSection>\n <ErrorNotice error={appAccountClient.error} />\n </AccountModalSection>\n );\n }\n\n if (!registerSpender && !registerDelegation) {\n return (\n <AccountModalSection>\n <div className=\"text-lg font-medium\">Your app account</div>\n <p>Blah blah blah app account</p>\n <p>All sorted</p>\n </AccountModalSection>\n );\n }\n\n return (\n <AccountModalSection>\n <div className=\"text-lg font-medium\">Set up account</div>\n <p>Blah blah blah app account</p>\n {appAccountClient.data ? (\n <Button\n className=\"self-start\"\n pending={setup.status === \"pending\"}\n onClick={async () => {\n await setup.mutateAsync({\n userClient,\n appAccountAddress: appAccountClient.data.account.address,\n registerSpender,\n registerDelegation,\n });\n closeAccountModal();\n }}\n >\n Set up\n </Button>\n ) : (\n <p>not ready</p>\n )}\n </AccountModalSection>\n );\n}\n","import { Table } from \"@latticexyz/config\";\nimport { UseReadContractParameters, UseReadContractReturnType, useReadContract } from \"wagmi\";\nimport IStoreReadAbi from \"@latticexyz/store/out/IStoreRead.sol/IStoreRead.abi.json\";\nimport {\n decodeValueArgs,\n getKeySchema,\n getKeyTuple,\n getSchemaPrimitives,\n getSchemaTypes,\n getValueSchema,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { Hex } from \"viem\";\n\n// TODO: move to our own useQuery so we can control the query key\n\nexport function useRecord<table extends Table>({\n table,\n key,\n ...opts\n}: Omit<\n UseReadContractParameters<typeof IStoreReadAbi, \"getRecord\", [Hex, readonly Hex[]]>,\n \"abi\" | \"functionName\" | \"args\"\n> & {\n readonly table?: table;\n readonly key?: getSchemaPrimitives<getKeySchema<table>>;\n}): UseReadContractReturnType<\n typeof IStoreReadAbi,\n \"getRecord\",\n [Hex, readonly Hex[]],\n getSchemaPrimitives<table[\"schema\"]>\n> {\n return useReadContract(\n table && key && opts.query?.enabled !== false\n ? {\n ...opts,\n abi: IStoreReadAbi,\n functionName: \"getRecord\",\n args: [table.tableId, getKeyTuple(table, key)],\n query: {\n ...opts.query,\n select: (data) => ({\n ...key,\n ...decodeValueArgs(getSchemaTypes(getValueSchema(table)), {\n staticData: data[0],\n encodedLengths: data[1],\n dynamicData: data[2],\n }),\n }),\n },\n }\n : {},\n );\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useRecord } from \"../useRecord\";\nimport { paymasterTables } from \"../paymaster\";\n\nexport function useAllowance(user: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n\n return useRecord({\n chainId,\n address: paymasterAddress,\n ...(user\n ? {\n table: paymasterTables.Allowance,\n key: { user },\n }\n : null),\n });\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport function useClaimGasPass() {\n const queryClient = useQueryClient();\n\n // TODO: add types for RPC methods\n // TODO: use client.request once this is behind proxyd\n const { passIssuerTransport } = useEntryKitConfig();\n return useMutation({\n mutationKey: [\"claimGasPass\"],\n mutationFn: async (userAddress: Address) => {\n const transport = passIssuerTransport({ retryCount: 0 });\n await transport.request({\n method: \"quarry_issuePass\",\n params: [\"0x01\", userAddress],\n });\n await transport.request({\n method: \"quarry_claimAllowance\",\n params: [\"0x01\", userAddress],\n });\n\n await queryClient.invalidateQueries({ queryKey: [\"readContract\"] });\n },\n });\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function EthIcon({ className, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 263 428\"\n fill=\"currentColor\"\n className={twMerge(\"w-[0.6em] h-[1em]\", className)}\n {...props}\n >\n <path d=\"M132 321V428L263 243L132 321Z\" />\n <path d=\"M0 243L132 321V428\" fillOpacity=\"0.5\" />\n <path d=\"M132 0V296L263 218\" />\n <path d=\"M0 218L132 296V0L0 218Z\" fillOpacity=\"0.5\" />\n </svg>\n );\n}\n","import { formatEther } from \"viem\";\n\nexport function formatBalance(wei: bigint) {\n // TODO: should this support non-ether decimals?\n const formatted = formatEther(wei);\n const magnitude = Math.floor(parseFloat(formatted)).toString().length;\n return parseFloat(formatted).toLocaleString(\"en-US\", { maximumFractionDigits: Math.max(0, 6 - magnitude) });\n}\n","import { EthIcon } from \"../icons/EthIcon\";\nimport { formatBalance } from \"../formatBalance\";\n\ntype Props = {\n wei: bigint;\n};\n\nexport function Balance({ wei }: Props) {\n return (\n <span className=\"inline-flex items-center gap-1\">\n {formatBalance(wei)} <EthIcon />\n </span>\n );\n}\n","import { AccountModalSection } from \"../AccountModalSection\";\nimport { ErrorNotice } from \"../ErrorNotice\";\nimport { Hex } from \"viem\";\nimport { useAllowance } from \"./useAllowance\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\nimport { useClaimGasPass } from \"./useClaimGasPass\";\nimport { Button } from \"../ui/Button\";\nimport { Balance } from \"../ui/Balance\";\nimport { useEffect } from \"react\";\n\nexport type Props = {\n userAddress: Hex;\n};\n\nexport function ClaimGasPass({ userAddress }: Props) {\n const allowance = useAllowance(userAddress);\n const claimGasPass = useClaimGasPass();\n\n // TODO: improve pending state since this is kicked off automatically and showing a pending button is weird\n useEffect(() => {\n if (claimGasPass.status === \"idle\" && allowance.data?.allowance === 0n) {\n claimGasPass.mutate(userAddress);\n }\n }, [allowance.data?.allowance, claimGasPass, userAddress]);\n\n if (allowance.status === \"pending\") {\n // TODO: better loading state/message\n return (\n <AccountModalSection className=\"items-center justify-center\">\n <PendingIcon />\n </AccountModalSection>\n );\n }\n\n if (allowance.status === \"error\") {\n // TODO: better error state/message\n return (\n <AccountModalSection>\n <ErrorNotice error={allowance.error} />\n </AccountModalSection>\n );\n }\n\n return (\n <>\n <AccountModalSection>\n <div className=\"text-lg font-medium\">Top up</div>\n <div className=\"space-y-4\">\n {allowance.data.allowance > 0n ? (\n <p>\n You currently have <Balance wei={allowance.data.allowance} /> allowance to spend on gas.\n </p>\n ) : (\n <>\n <p>You haven&apos;t claimed a gas pass yet.</p>\n <div className=\"flex flex-col\">\n <Button\n className=\"self-start\"\n pending={claimGasPass.status === \"pending\"}\n onClick={() => claimGasPass.mutate(userAddress)}\n >\n Claim gas pass\n </Button>\n {/* TODO: better error styles */}\n {claimGasPass.status === \"error\" ? (\n <div className=\"bg-red-100 text-red-700 text-sm p-2 animate-in animate-duration-200 fade-in\">\n {claimGasPass.error.message}\n </div>\n ) : null}\n </div>\n </>\n )}\n </div>\n </AccountModalSection>\n </>\n );\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useRecord } from \"../useRecord\";\nimport { paymasterTables } from \"../paymaster\";\n\nexport function useSpender(spender: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n\n return useRecord({\n chainId,\n address: paymasterAddress,\n ...(spender\n ? {\n table: paymasterTables.Spender,\n key: { spender },\n }\n : null),\n });\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useRecord } from \"../useRecord\";\nimport { worldTables } from \"../common\";\n\nexport function useDelegation(delegator: Address | undefined, delegatee: Address | undefined) {\n const { chainId, worldAddress } = useEntryKitConfig();\n\n return useRecord({\n chainId,\n address: worldAddress,\n ...(delegator && delegatee\n ? {\n table: worldTables.UserDelegationControl,\n key: { delegator, delegatee },\n }\n : null),\n });\n}\n","import { ConnectedWallet } from \"./ConnectedWallet\";\nimport { SetupAppAccount } from \"./SetupAppAccount\";\nimport { useAllowance } from \"./useAllowance\";\nimport { ClaimGasPass } from \"./ClaimGasPass\";\nimport { useAppAccountClient } from \"../useAppAccountClient\";\nimport { useSpender } from \"./useSpender\";\nimport { Step } from \"./common\";\nimport { useDelegation } from \"./useDelegation\";\nimport { useMemo } from \"react\";\nimport { ConnectedClient, unlimitedDelegationControlId } from \"../common\";\n\nexport function useSteps(userClient: ConnectedClient | undefined): readonly Step[] {\n const userAddress = userClient?.account.address;\n const allowance = useAllowance(userAddress);\n const appAccountClient = useAppAccountClient(userAddress);\n\n const spender = useSpender(appAccountClient.data?.account.address);\n const isSpender = userAddress && spender.data ? spender.data.user.toLowerCase() === userAddress.toLowerCase() : false;\n\n const delegation = useDelegation(userClient?.account.address, appAccountClient.data?.account.address);\n const hasDelegation = delegation.data ? delegation.data?.delegationControlId === unlimitedDelegationControlId : false;\n\n return useMemo(() => {\n if (!userAddress) {\n return [\n {\n id: \"connectWallet\",\n label: \"Sign in\",\n isComplete: false,\n content: null,\n },\n ];\n }\n\n return [\n {\n id: \"connectWallet\",\n label: \"Sign in\",\n isComplete: true,\n content: <ConnectedWallet userAddress={userAddress} />,\n },\n {\n id: \"claimGasPass\",\n label: \"Top up\",\n isComplete: (allowance.data?.allowance ?? 0n) > 0n,\n content: <ClaimGasPass userAddress={userAddress} />,\n },\n {\n id: \"setupAppAccount\",\n label: \"Set up account\",\n isComplete: isSpender && hasDelegation,\n content: (\n <SetupAppAccount userClient={userClient} registerSpender={!isSpender} registerDelegation={!hasDelegation} />\n ),\n },\n ];\n }, [allowance.data?.allowance, hasDelegation, isSpender, userAddress, userClient]);\n}\n","import { ConnectedClient } from \"../common\";\nimport { Steps } from \"./Steps\";\nimport { useSteps } from \"./useSteps\";\n\nexport type Props = {\n userClient: ConnectedClient;\n};\n\nexport function ConnectedSteps({ userClient }: Props) {\n const steps = useSteps(userClient);\n return <Steps steps={steps} />;\n}\n","import { ReactNode, useState } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { ErrorNotice } from \"./ErrorNotice\";\nimport { wait } from \"@latticexyz/common/utils\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useIsMounted } from \"usehooks-ts\";\nimport { PendingIcon } from \"./icons/PendingIcon\";\n\nexport type Props = {\n children: ReactNode;\n};\n\nexport function AccountModalErrorBoundary({ children }: Props) {\n const isMounted = useIsMounted();\n const [retries, setRetries] = useState(1);\n\n // TODO: invalidate query cache?\n\n return (\n <ErrorBoundary\n fallbackRender={({ error, resetErrorBoundary }) => (\n <div className={twMerge(\"flex-grow flex flex-col justify-center p-5 gap-2\")}>\n <ErrorNotice error={error instanceof Error ? error.stack ?? error.message : error} />\n {retries > 0 ? (\n <button\n type=\"button\"\n onClick={async (event) => {\n // fake pending state while we retry so that if the same error occurs,\n event.currentTarget.ariaBusy = \"true\";\n await wait(1000);\n resetErrorBoundary();\n if (isMounted()) {\n setRetries((value) => value - 1);\n event.currentTarget.ariaBusy = null;\n }\n }}\n className=\"group aria-busy:pointer-events-none self-end flex items-center gap-1\"\n >\n <PendingIcon className=\"transition opacity-0 group-aria-busy:opacity-100 text-xs text-neutral-500 dark:text-neutral-400\" />\n <span className=\"text-sm text-neutral-500 dark:text-neutral-400 group-hover:text-black dark:group-hover:text-white\">\n Retry?\n </span>\n </button>\n ) : null}\n </div>\n )}\n >\n {children}\n </ErrorBoundary>\n );\n}\n","import { SVGProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = SVGProps<SVGSVGElement>;\n\nexport function IconSVG({ className, children, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {children}\n </svg>\n );\n}\n","import { IconSVG, Props } from \"./IconSVG\";\n\nexport function CloseIcon(props: Props) {\n return (\n <IconSVG strokeWidth=\"2\" stroke=\"currentColor\" {...props}>\n <path\n d=\"M6 18L18 6M6 6L18 18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { type ReactNode } from \"react\";\nimport { AccountModal } from \"./AccountModal\";\nimport { EntryKitConfig } from \"./config\";\nimport { EntryKitConfigProvider } from \"./EntryKitConfigProvider\";\n\n// We separate the config provider and wrap it here to always include the modal.\n// We could do this in EntryKitConfigProvider directly, but it mucks with hot\n// reloading in development and this approach lets us work around it more easily.\n\nexport type Props = {\n config: EntryKitConfig;\n children?: ReactNode;\n};\n\nexport function EntryKitProvider({ config, children }: Props) {\n return (\n <EntryKitConfigProvider config={config}>\n {children}\n <AccountModal />\n </EntryKitConfigProvider>\n );\n}\n","import { useAccountModal } from \"./useAccountModal\";\nimport { Shadow } from \"./ui/Shadow\";\nimport { Logo } from \"./icons/Logo\";\nimport { useAccount } from \"wagmi\";\nimport { twMerge } from \"tailwind-merge\";\nimport { PendingIcon } from \"./icons/PendingIcon\";\nimport { AccountName } from \"./AccountName\";\n\nconst containerClassNames = twMerge(\n \"w-60 inline-flex outline-none transition\",\n \"border border-transparent\",\n \"text-base leading-none\",\n);\n\nconst secondaryClassNames = twMerge(\n \"bg-neutral-100 border-neutral-300 text-black\",\n \"dark:bg-neutral-800 dark:border-neutral-700 dark:text-white\",\n);\nconst secondaryInteractiveClassNames = twMerge(\n \"cursor-pointer outline-none hover:bg-neutral-200 data-[highlighted]:bg-neutral-200 dark:hover:bg-neutral-700\",\n);\n\nexport function AccountButton() {\n const { openAccountModal, accountModalOpen } = useAccountModal();\n const { status, address } = useAccount();\n\n // TODO: show indicator that onboarding is not complete\n\n return (\n <Shadow mode=\"child\">\n {status === \"connected\" || (status === \"reconnecting\" && address) ? (\n <button\n // key is used to avoid triggering transitions between connected/disconnected states\n key=\"connected\"\n type=\"button\"\n className={twMerge(containerClassNames, secondaryClassNames, secondaryInteractiveClassNames, \"p-3\")}\n onClick={openAccountModal}\n >\n <span className=\"flex-grow inline-flex gap-2.5 items-center text-left font-medium\">\n <AccountName address={address} />\n </span>\n </button>\n ) : (\n <button\n // key is used to avoid triggering transitions between connected/disconnected states\n key=\"sign in\"\n type=\"button\"\n className={twMerge(\n containerClassNames,\n \"group\",\n \"items-center justify-center gap-2.5 p-3\",\n \"bg-orange-500 text-white font-medium\",\n \"hover:bg-orange-400\",\n \"active:bg-orange-600\",\n \"aria-busy:saturate-50\",\n )}\n aria-busy={accountModalOpen}\n onClick={openAccountModal}\n >\n <span className=\"pointer-events-none inline-grid place-items-center -ml-3\">\n <span\n className={twMerge(\n \"col-start-1 row-start-1 leading-none\",\n \"scale-100 opacity-100 transition duration-300\",\n \"group-aria-busy:scale-125 group-aria-busy:opacity-0\",\n )}\n >\n <Logo />\n </span>\n <span\n aria-hidden\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"scale-50 opacity-0 transition duration-300 delay-50\",\n \"group-aria-busy:scale-100 group-aria-busy:opacity-100\",\n )}\n >\n <PendingIcon />\n </span>\n </span>\n <span className=\"font-medium\">Sign in</span>\n </button>\n )}\n </Shadow>\n );\n}\n","import { Hex } from \"viem\";\nimport { useENS } from \"./useENS\";\nimport { Logo } from \"./icons/Logo\";\nimport { TruncatedHex } from \"./ui/TruncatedHex\";\nimport { usePreloadImage } from \"./usePreloadImage\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n address: Hex | undefined;\n};\n\nexport function AccountName({ address }: Props) {\n const { data: ens } = useENS(address);\n const { isSuccess: hasAvatar } = usePreloadImage(ens.avatar);\n\n return (\n <>\n <span className=\"flex-shrink-0 w-6 h-6 -my-1 -mx-0.5 grid place-items-center\">\n <img\n src={hasAvatar ? ens.avatar : undefined}\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"inline-flex w-full h-full rounded-full bg-black/10 dark:bg-white/10 bg-cover bg-no-repeat bg-center\",\n hasAvatar ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <Logo\n className={twMerge(\n \"col-start-1 row-start-1 text-orange-500\",\n \"transition duration-300\",\n hasAvatar ? \"opacity-0\" : \"opacity-100\",\n )}\n />\n </span>\n <span className=\"flex-grow\">{ens.name ?? (address ? <TruncatedHex hex={address} /> : null)}</span>\n </>\n );\n}\n","// Used externally and only provides the app account client once all requirements are met.\n\nimport { useAppAccountClient } from \"./useAppAccountClient\";\nimport { useConnectorClient } from \"wagmi\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useSteps } from \"./onboarding/useSteps\";\nimport { useMemo } from \"react\";\nimport { ConnectedClient } from \"./common\";\n\nexport function usePreparedAppAccountClient(): ConnectedClient | undefined {\n const { chainId } = useEntryKitConfig();\n const { data: userClient, error: userClientError } = useConnectorClient({ chainId });\n if (userClientError) console.error(\"Error retrieving user client\", userClientError);\n\n const appAccountClient = useAppAccountClient(userClient?.account.address);\n const steps = useSteps(userClient);\n\n return useMemo(() => {\n if (!steps.every((step) => step.isComplete)) return;\n return appAccountClient.data;\n }, [appAccountClient.data, steps]);\n}\n"],"mappings":"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","names":["DialogRoot","DialogPortal","DialogContent","forwardRef","useEffect","useRef","useState","ReactDOM","useResizeObserver","mergeRefs","createContext","useContext","jsx","Context","FrameProvider","frame","children","useMediaQuery","createContext","useContext","RainbowKitProvider","lightTheme","midnightTheme","useConnectors","usePasskeyConnector","connector","useConnectors","c","passkeyConnector","jsx","Context","createContext","EntryKitConfigProvider","config","children","useContext","usePasskeyConnector","RainbowKitProvider","lightTheme","midnightTheme","useEntryKitConfig","useTheme","initialTheme","useEntryKitConfig","darkMode","useMediaQuery","jsx","jsxs","Resizer","onSize","props","ref","useRef","useResizeObserver","Shadow","forwardRef","mode","children","forwardedRef","frameRef","loaded","setLoaded","useState","frame","frameSize","setFrameSize","frameDocument","theme","useTheme","useEffect","frameStyle","mergeRefs","ReactDOM","FrameProvider","tailwind_default","twMerge","jsx","jsxs","Modal","open","onOpenChange","children","DialogRoot","DialogPortal","Shadow","DialogContent","useCallback","useMemo","useStore","createStore","store","useAccountModal","accountModalOpen","state","openAccountModal","closeAccountModal","toggleAccountModal","open","twMerge","useConnectorClient","useAccount","twMerge","twMerge","jsx","jsxs","PendingIcon","className","props","jsx","jsxs","buttonClassName","variant","pending","twMerge","Button","type","className","children","disabled","props","PendingIcon","useConnectModal","useMutation","twMerge","jsx","jsxs","Logo","className","props","useAppInfo","appInfo","useEntryKitConfig","appName","appOrigin","appIcon","appImage","useQuery","usePreloadImage","url","resolve","reject","image","jsx","jsxs","AppInfo","appName","appOrigin","appIcon","useAppInfo","hasAppIcon","appIconLoading","usePreloadImage","Logo","Fragment","jsx","jsxs","ConnectWallet","userAccount","useAccount","accountModalOpen","useAccountModal","openConnectModal","connectModalOpen","useConnectModal","passkeyConnector","usePasskeyConnector","createPasskey","useMutation","AppInfo","Button","Logo","useState","twMerge","Fragment","jsx","jsxs","Steps","steps","selectedStepId","setSelectedStepId","nextStep","step","completedSteps","activeStep","useDisconnect","twMerge","jsx","AccountModalSection","className","children","useQuery","useENS","address","normalizedAddress","data","res","jsx","jsxs","TruncatedHex","hex","twMerge","BaseError","UserRejectedRequestError","jsx","jsxs","ErrorNotice","initialTitle","error","e","title","message","Fragment","jsx","jsxs","ConnectedWallet","userAddress","ens","useENS","disconnect","disconnectIsPending","disconnectError","useDisconnect","closeAccountModal","useAccountModal","AccountModalSection","TruncatedHex","ErrorNotice","Button","useClient","useQuery","createStore","persist","store","appSigners","listener","event","generatePrivateKey","privateKeyToAccount","getAppSigner","userAddress","appSignerPrivateKey","store","privateKey","state","createSmartAccountClient","callFrom","getAppAccountClient","worldAddress","userAddress","client","bundlerTransport","paymasterAddress","appSigner","getAppSigner","account","toCoinbaseSmartAccount","createSmartAccountClient","defaultClientConfig","callFrom","useAppAccountClient","userAddress","chainId","bundlerTransport","paymasterAddress","worldAddress","useEntryKitConfig","client","useClient","queryKey","useQuery","getAppAccountClient","useMutation","useQueryClient","getAction","sendUserOperation","waitForUserOperationReceipt","defineStore","parseAbi","paymasterAbi","paymasterConfig","paymasterTables","useSetupAppAccount","worldAddress","paymasterAddress","useEntryKitConfig","queryClient","useQueryClient","useMutation","userClient","appAccountAddress","registerSpender","registerDelegation","calls","paymasterAbi","worldAbi","unlimitedDelegationControlId","hash","getAction","sendUserOperation","receipt","waitForUserOperationReceipt","jsx","jsxs","SetupAppAccount","userClient","registerSpender","registerDelegation","closeAccountModal","useAccountModal","appAccountClient","useAppAccountClient","setup","useSetupAppAccount","AccountModalSection","PendingIcon","ErrorNotice","Button","useReadContract","IStoreReadAbi","decodeValueArgs","getKeyTuple","getSchemaTypes","getValueSchema","useRecord","table","key","opts","data","useAllowance","user","chainId","paymasterAddress","useEntryKitConfig","useRecord","paymasterTables","useMutation","useQueryClient","useClaimGasPass","queryClient","passIssuerTransport","useEntryKitConfig","userAddress","transport","twMerge","jsx","jsxs","EthIcon","className","props","formatEther","formatBalance","wei","formatted","magnitude","jsx","jsxs","Balance","wei","formatBalance","EthIcon","useEffect","Fragment","jsx","jsxs","ClaimGasPass","userAddress","allowance","useAllowance","claimGasPass","useClaimGasPass","AccountModalSection","PendingIcon","ErrorNotice","Balance","Button","useSpender","spender","chainId","paymasterAddress","useEntryKitConfig","useRecord","paymasterTables","useDelegation","delegator","delegatee","chainId","worldAddress","useEntryKitConfig","useRecord","worldTables","useMemo","jsx","useSteps","userClient","userAddress","allowance","useAllowance","appAccountClient","useAppAccountClient","spender","useSpender","isSpender","delegation","useDelegation","hasDelegation","unlimitedDelegationControlId","useMemo","ConnectedWallet","ClaimGasPass","SetupAppAccount","jsx","ConnectedSteps","userClient","steps","useSteps","Steps","jsx","AccountModalContent","chainId","useEntryKitConfig","userClient","useConnectorClient","ConnectWallet","ConnectedSteps","useState","ErrorBoundary","wait","twMerge","useIsMounted","jsx","jsxs","AccountModalErrorBoundary","children","isMounted","useIsMounted","retries","setRetries","useState","ErrorBoundary","error","resetErrorBoundary","twMerge","ErrorNotice","event","wait","value","PendingIcon","DialogClose","DialogTitle","twMerge","jsx","IconSVG","className","children","props","jsx","CloseIcon","props","IconSVG","jsx","jsxs","AccountModal","accountModalOpen","toggleAccountModal","useAccountModal","Modal","DialogTitle","twMerge","AccountModalErrorBoundary","AccountModalContent","DialogClose","CloseIcon","jsx","jsxs","EntryKitProvider","config","children","EntryKitConfigProvider","AccountModal","useAccount","twMerge","twMerge","Fragment","jsx","jsxs","AccountName","address","ens","useENS","hasAvatar","usePreloadImage","Logo","TruncatedHex","jsx","jsxs","containerClassNames","twMerge","secondaryClassNames","secondaryInteractiveClassNames","AccountButton","openAccountModal","accountModalOpen","useAccountModal","status","address","useAccount","Shadow","AccountName","Logo","PendingIcon","useConnectorClient","useMemo","usePreparedAppAccountClient","chainId","useEntryKitConfig","userClient","userClientError","useConnectorClient","appAccountClient","useAppAccountClient","steps","useSteps","step"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}