@latticexyz/entrykit 2.2.15-entrykit-7c66951c16002df8904aa48c4e4afe6bf1026170 → 2.2.15-entrykit-72b365945eec0575285c2725d7a5e4089a7dba5a

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/config/defineConfig.ts","../../src/ui/Modal.tsx","../../src/ui/Shadow.tsx","../../src/ui/FrameProvider.tsx","../../src/useTheme.ts","../../src/EntryKitConfigProvider.tsx","../../src/getPaymasterAddress.ts","../../src/useAccountModal.ts","../../src/AccountModal.tsx","../../src/AccountModalContent.tsx","../../src/ConnectWallet.tsx","../../src/ui/Button.tsx","../../src/icons/PendingIcon.tsx","../../src/usePasskeyConnector.ts","../../src/passkey/passkeyConnector.ts","../../src/passkey/cache.ts","../../src/passkey/getAccount.ts","../../src/smart-account/toCoinbaseSmartAccount.ts","../../src/passkey/reusePasskey.ts","../../src/passkey/getMessageHash.ts","../../src/passkey/recoverPasskeyPublicKey.ts","../../src/passkey/getCandidatePublicKeys.ts","../../src/passkey/createPasskey.ts","../../src/common.ts","../../src/createBundlerClient.ts","../../src/getBundlerTransport.ts","../../src/transports/userOpExecutor.ts","../../src/transports/methods/estimateUserOperationGas.ts","../../src/transports/methods/sendUserOperation.ts","../../src/transports/gasEstimator.ts","../../src/transports/wiresaw.ts","../../src/icons/Logo.tsx","../../src/useAppInfo.ts","../../src/usePreloadImage.tsx","../../src/AppInfo.tsx","../../src/onboarding/ConnectedSteps.tsx","../../src/onboarding/common.ts","../../src/onboarding/useAllowance.ts","../../src/paymaster.ts","../../src/utils/getRecord.ts","../../src/onboarding/getAllowance.ts","../../src/onboarding/useSpender.ts","../../src/onboarding/getSpender.ts","../../src/onboarding/useDelegation.ts","../../src/onboarding/getDelegation.ts","../../src/onboarding/usePrerequisites.ts","../../src/useSessionAccount.ts","../../src/store.ts","../../src/getSessionSigner.ts","../../src/getSessionAccount.ts","../../src/onboarding/Wallet.tsx","../../src/useENS.ts","../../src/ui/TruncatedHex.tsx","../../src/onboarding/useClaimGasPass.ts","../../src/transports/quarryPassIssuer.ts","../../src/icons/EthIcon.tsx","../../src/formatBalance.ts","../../src/ui/Balance.tsx","../../src/onboarding/Allowance.tsx","../../src/onboarding/useSetupSession.ts","../../src/utils/callWithSignature.ts","../../src/utils/signCall.tsx","../../src/onboarding/Session.tsx","../../src/useSessionClient.ts","../../src/getSessionClient.ts","../../src/AccountModalErrorBoundary.tsx","../../src/ErrorNotice.tsx","../../src/icons/IconSVG.tsx","../../src/icons/CloseIcon.tsx","../../src/EntryKitProvider.tsx","../../src/AccountButton.tsx","../../src/AccountName.tsx","../../src/useSessionClientReady.ts","../../src/createWagmiConfig.ts","../../src/passkey/passkeyWallet.ts","../../src/smart-account/isCoinbaseSmartAccount.ts","../../src/getConnectors.ts","../../src/getWallets.ts"],"sourcesContent":["import { EntryKitConfigInput } from \"./input\";\nimport { EntryKitConfig } from \"./output\";\n\nexport function defineConfig(input: EntryKitConfigInput): EntryKitConfig {\n return {\n ...input,\n appName: input.appName ?? document.title,\n appIcon: input.appIcon ?? document.querySelector(\"link[rel~='icon']\")?.getAttribute(\"href\") ?? \"/favico.ico\",\n };\n}\n","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 className={twMerge(\"fixed inset-0\", \"bg-neutral-800/85\", \"animate-in animate-duration-300 fade-in\")} />\n <div\n className={twMerge(\n \"fixed inset-0\",\n \"grid items-end sm:items-center\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-16\",\n )}\n >\n <div>\n <DialogContent\n className=\"outline-none w-full max-w-[26rem] mx-auto\"\n // TODO description\n aria-describedby={undefined}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n {children}\n </DialogContent>\n </div>\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-grid\" }} />;\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: \"100%\",\n height: \"100%\",\n zIndex: \"2147483646\",\n }\n : frameSize.width && frameSize.height\n ? {\n all: \"unset\",\n display: \"inline-grid\",\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: \"100%\",\n height: \"100%\",\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/output\";\nimport { Address, Chain } from \"viem\";\nimport { useChains } from \"wagmi\";\nimport { getPaymasterAddress } from \"./getPaymasterAddress\";\n\ntype ContextValue = EntryKitConfig & {\n chain: Chain;\n paymasterAddress: Address;\n};\n\n/** @internal */\nconst Context = createContext<ContextValue | 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 // TODO: move chain-based lookups to function so we can reuse here and in passkeyConnector\n\n const chains = useChains();\n const chain = chains.find(({ id }) => id === config.chainId);\n if (!chain) throw new Error(`Could not find configured chain for chain ID ${config.chainId}.`);\n\n const paymasterAddress = getPaymasterAddress(chain);\n\n return (\n <RainbowKitProvider\n initialChain={config.chainId}\n appInfo={{\n appName: config.appName,\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, chain, paymasterAddress }}>{children}</Context.Provider>\n </RainbowKitProvider>\n );\n}\n\nexport function useEntryKitConfig(): ContextValue {\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 { Chain } from \"viem\";\n\nexport function getPaymasterAddress(chain: Chain) {\n const paymasterAddress =\n chain.contracts?.quarryPaymaster && \"address\" in chain.contracts.quarryPaymaster\n ? chain.contracts?.quarryPaymaster.address\n : undefined;\n if (!paymasterAddress) {\n throw new Error(`Chain ${chain.id} config did not include a \\`quarryPaymaster\\` contract address.`);\n }\n return paymasterAddress;\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\";\nimport { Logo } from \"./icons/Logo\";\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 py-2 ring-1\",\n \"bg-neutral-900 text-neutral-400 ring-neutral-700/50 divide-neutral-700\",\n \"links:font-medium links:underline links:underline-offset-4\",\n \"links:text-white\",\n \"links:decoration-neutral-500 hover:links:decoration-orange-500\",\n )}\n >\n <AccountModalErrorBoundary>\n <AccountModalContent />\n </AccountModalErrorBoundary>\n\n <a\n href=\"https://mud.dev\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"group self-center p-3 flex items-center justify-center gap-2 links-unset text-sm font-mono transition text-neutral-400 hover:text-white\"\n >\n <span className=\"block w-4 h-4\">\n <Logo className=\"w-full h-full text-orange-500 group-hover:rotate-90 transition duration-300\" />\n </span>\n <span>Powered by MUD</span>\n </a>\n\n <div className=\"absolute top-0 right-0\">\n <DialogClose\n className={twMerge(\n \"pointer-events-auto leading-none p-2 transition\",\n \"text-neutral-700 hover:text-neutral-500\",\n )}\n title=\"Close\"\n >\n <CloseIcon className=\"m-0\" />\n </DialogClose>\n </div>\n </div>\n ) : null}\n </Modal>\n );\n}\n","import { useAccount, useConnectorClient } from \"wagmi\";\nimport { ConnectWallet } from \"./ConnectWallet\";\nimport { ConnectedSteps } from \"./onboarding/ConnectedSteps\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useRef } from \"react\";\n\nexport function AccountModalContent() {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n const { address: userAddress } = useAccount();\n const initialUserAddress = useRef(userAddress);\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n console.log(\"rendering connected steps\");\n return <ConnectedSteps userClient={userClient.data} initialUserAddress={initialUserAddress.current} />;\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 { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function ConnectWallet() {\n const userAccount = useAccount();\n const { accountModalOpen } = useAccountModal();\n const { openConnectModal, connectModalOpen } = useConnectModal();\n\n // TODO: show error states\n // TODO: fix passkey issue where pending state disappears but we don't transition right away\n\n const passkeyConnector = usePasskeyConnector();\n const createPasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"createPasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.createPasskey(),\n });\n const reusePasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"reusePasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.reusePasskey(),\n });\n\n const hasPasskey = passkeyConnector.hasPasskey();\n\n const buttons = [\n <Button\n key=\"create\"\n variant={hasPasskey ? \"tertiary\" : \"secondary\"}\n className=\"self-auto flex justify-center\"\n pending={createPasskey.status === \"pending\" || createPasskey.status === \"success\"}\n onClick={() => createPasskey.mutate()}\n autoFocus={!hasPasskey}\n >\n Create account\n </Button>,\n <Button\n key=\"signin\"\n variant={hasPasskey ? \"secondary\" : \"tertiary\"}\n className=\"self-auto flex justify-center\"\n pending={reusePasskey.status === \"pending\" || reusePasskey.status === \"success\"}\n onClick={() => reusePasskey.mutate()}\n autoFocus={hasPasskey}\n >\n Sign in\n </Button>,\n ];\n\n if (hasPasskey) {\n buttons.reverse();\n }\n\n return (\n <div\n className={twMerge(\"flex flex-col gap-6 p-6\", \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\")}\n >\n <div className=\"p-4\">\n {/* TODO: render appImage if available? */}\n <AppInfo />\n </div>\n <div className=\"self-center flex flex-col gap-2 w-60\">\n {buttons}\n <button\n className=\"text-sm self-center transition text-neutral-500 hover:text-white p-2\"\n disabled={userAccount.status === \"connecting\"}\n // TODO: figure out how to prevent this from switching chains after connecting\n onClick={openConnectModal}\n >\n Already have a wallet?\n </button>\n </div>\n </div>\n );\n}\n","/* eslint-disable max-len */\nimport { 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// TODO: add error state with popover/tooltip\n\ntype ButtonClassNameOptions = {\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n pending?: boolean;\n};\n\nconst buttonClassName = ({ variant = \"secondary\" }: ButtonClassNameOptions = {}) =>\n twMerge(\n \"group/button self-center leading-none outline-none border-4 border-transparent\",\n \"transition hover:brightness-125 active:brightness-150\",\n \"focus:border-orange-500\",\n \"aria-disabled:pointer-events-none aria-busy:pointer-events-none\",\n // TODO: better disabled state\n \"aria-disabled:opacity-50\",\n \"p-[.75em] font-medium\",\n {\n primary: twMerge(\"bg-orange-600 text-white focus:border-yellow-400\"),\n secondary: twMerge(\"bg-neutral-700 text-white focus:border-orange-500\"),\n tertiary: twMerge(\"bg-neutral-800 text-white focus:border-orange-500\"),\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/button:opacity-100 group-aria-busy/button:translate-x-0 duration-100 group-aria-busy/button: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 { 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 {\n createClient,\n custom,\n EIP1193RequestFn,\n EIP1474Methods,\n getAddress,\n numberToHex,\n SwitchChainError,\n Client,\n ProviderConnectInfo,\n} from \"viem\";\nimport { ChainNotConfiguredError, createConnector, CreateConnectorFn } from \"wagmi\";\nimport { cache } from \"./cache\";\nimport { smartAccountActions } from \"permissionless/clients\";\nimport { getAccount } from \"./getAccount\";\nimport { reusePasskey } from \"./reusePasskey\";\nimport { createPasskey } from \"./createPasskey\";\nimport { defaultClientConfig } from \"../common\";\nimport { createBundlerClient } from \"../createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\nimport { getPaymasterAddress } from \"../getPaymasterAddress\";\nimport { getBundlerTransport } from \"../getBundlerTransport\";\nimport { wiresaw } from \"../transports/wiresaw\";\n\nexport type PasskeyConnectorOptions = {\n // TODO: figure out what we wanna do across chains\n chainId: number;\n};\n\nexport type PasskeyProvider = {\n request: EIP1193RequestFn<EIP1474Methods>;\n};\n\nexport type PasskeyConnectorProperties = {\n createPasskey(): Promise<void>;\n reusePasskey(): Promise<void>;\n // TODO: does wagmi storage require this to be async?\n hasPasskey(): boolean;\n getClient(parameters?: { chainId?: number | undefined } | undefined): Promise<Client>;\n onConnect(connectInfo: ProviderConnectInfo): void;\n};\n\nexport type CreatePasskeyConnector = CreateConnectorFn<PasskeyProvider, PasskeyConnectorProperties, {}>;\nexport type PasskeyConnector = ReturnType<CreatePasskeyConnector>;\n\npasskeyConnector.type = \"passkey\" as const;\n\nexport function passkeyConnector({ chainId }: PasskeyConnectorOptions): CreatePasskeyConnector {\n return createConnector((config) => {\n // TODO: figure out how to use with config's `client` option?\n if (!config.transports) {\n throw new Error(`Wagmi must be configured with transports to use the passkey connector.`);\n }\n\n const chain = config.chains.find((c) => c.id === chainId);\n if (!chain) throw new Error(`Could not find configured chain for chain ID ${chainId}.`);\n\n // TODO: wrap transports in wiresaw\n // TODO: adapt wiresaw transport to check chain config and conditionally make its own transport from wiresaw chain config and swap out methods\n\n const configTransport = config.transports[chain.id];\n if (!configTransport) {\n throw new Error(`Could not find configured transport for chain ID ${chainId}.`);\n }\n const transport = wiresaw(configTransport);\n\n const paymasterAddress = getPaymasterAddress(chain);\n const bundlerTransport = getBundlerTransport(chain);\n\n const client = createClient({ ...defaultClientConfig, chain, transport });\n\n let connected = cache.getState().activeCredential != null;\n\n return {\n id: \"passkey\",\n type: passkeyConnector.type,\n name: \"Passkey\",\n // TODO: check that this works\n // supportsSimulation: true,\n\n async createPasskey() {\n const { id } = await createPasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n async reusePasskey() {\n const { id } = await reusePasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n hasPasskey() {\n return Object.keys(cache.getState().publicKeys).length > 0;\n },\n\n async connect(params) {\n console.log(\"connect\");\n // TODO: allow any chain?\n if (params?.chainId != null && params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n // attempt to reuse credential if this is called directly\n // TODO: move this into wallet so it's only triggered via rainbowkit?\n if (!cache.getState().activeCredential && !params?.isReconnecting) {\n await reusePasskey();\n }\n\n const accounts = await this.getAccounts();\n connected = accounts.length > 0;\n\n return { accounts, chainId };\n },\n async disconnect() {\n console.log(\"disconnect\");\n connected = false;\n cache.setState({ activeCredential: null });\n },\n async getAccounts() {\n console.log(\"getAccounts\");\n const id = cache.getState().activeCredential;\n if (!id) return [];\n\n try {\n console.log(\"getting account for credential\", id);\n const account = await getAccount(client, id);\n console.log(\"got account\", account);\n return [account.address];\n } catch (error) {\n console.log(\"could not get address for credential ID\", id);\n }\n\n return [];\n },\n async getChainId() {\n return chainId;\n },\n async isAuthorized() {\n console.log(\"isAuthorized\");\n if (!connected) return false;\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n },\n async switchChain(params) {\n // TODO: allow any chain?\n if (params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n const chain = config.chains.find((c) => c.id === params.chainId);\n if (!chain) throw new SwitchChainError(new ChainNotConfiguredError());\n return chain;\n },\n onAccountsChanged(accounts) {\n console.log(\"onAccountsChanged\");\n if (accounts.length > 0) {\n config.emitter.emit(\"change\", {\n accounts: accounts.map((a) => getAddress(a)),\n });\n } else {\n this.onDisconnect();\n }\n },\n onChainChanged(chainId) {\n console.log(\"onChainChanged\");\n config.emitter.emit(\"change\", { chainId: Number(chainId) });\n },\n async onConnect(_connectInfo) {\n console.log(\"onConnect\");\n const accounts = await this.getAccounts();\n config.emitter.emit(\"connect\", { accounts, chainId });\n },\n async onDisconnect(_error) {\n console.log(\"onDisconnect\");\n config.emitter.emit(\"disconnect\");\n connected = false;\n },\n\n // By default, connector clients are bound to a `json-rpc` account.\n // We provide our own `getClient` method here so that we can return\n // a `smart` account, which is necessary for using with Viem's\n // account abstraction actions (i.e. user ops).\n //\n // Although Wagmi recommends connectors be tree-shakable, we return\n // an extended client here so that this client works with native\n // Wagmi hooks. Otherwise the app needs to build its own client, then\n // wrap each call in its own react-query hooks.\n async getClient(params) {\n console.log(\"passkeyConnector.getClient\", params);\n\n const credentialId = cache.getState().activeCredential;\n if (!credentialId) throw new Error(\"Not connected.\");\n\n const account = await getAccount(client, credentialId);\n\n return createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account,\n })\n .extend(smartAccountActions())\n .extend(observer());\n },\n\n async getProvider(_params) {\n // TODO: chain specific provider?\n // TODO: is turning off retryCount important? is wrapping in this way enough to turn off retries?\n return custom({ request: client.transport.request })({ retryCount: 0 });\n },\n };\n });\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\n// TODO: move this to wagmi storage?\n// when I tried, it blew up TS complexity and my IDE was impossible to work with\n\nexport type State = {\n readonly publicKeys: {\n readonly [key in P256Credential[\"id\"]]?: P256Credential[\"publicKey\"];\n };\n readonly activeCredential: P256Credential[\"id\"] | null;\n};\n\nexport const cache = createStore(\n persist<State>(\n () => ({\n publicKeys: {},\n activeCredential: null,\n }),\n { name: \"mud:passkey:cache\" },\n ),\n);\n\n// keep cache in sync across tabs/windows via storage event\nfunction listener(event: StorageEvent) {\n if (event.key === cache.persist.getOptions().name) {\n cache.persist.rehydrate();\n }\n}\nwindow.addEventListener(\"storage\", listener);\n","import { Client } from \"viem\";\nimport { toWebAuthnAccount } from \"viem/account-abstraction\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"webauthn-p256\";\nimport { toCoinbaseSmartAccount, ToCoinbaseSmartAccountReturnType } from \"../smart-account/toCoinbaseSmartAccount\";\n\nexport async function getAccount(client: Client, id: P256Credential[\"id\"]): Promise<ToCoinbaseSmartAccountReturnType> {\n const { publicKeys } = cache.getState();\n\n const publicKey = publicKeys[id];\n // TODO: should we prompt to recover key here?\n if (!publicKey) {\n throw new Error(\"No public key found for passkey credential.\");\n }\n\n const passkey = toWebAuthnAccount({ credential: { id, publicKey } });\n const owners = [passkey];\n\n return await toCoinbaseSmartAccount({ client, owners });\n}\n","// Forked from https://github.com/wevm/viem/blob/main/src/account-abstraction/accounts/implementations/toCoinbaseSmartAccount.ts\n// to match our forked contracts (upgrade to v0.7 entrypoint)\nimport {\n Client,\n OneOf,\n LocalAccount,\n Prettify,\n Assign,\n pad,\n encodeFunctionData,\n hashMessage,\n TypedDataDefinition,\n hashTypedData,\n Hash,\n encodeAbiParameters,\n stringToHex,\n size,\n encodePacked,\n parseSignature,\n Address,\n TypedData,\n BaseError,\n} from \"viem\";\nimport {\n WebAuthnAccount,\n SmartAccount,\n SmartAccountImplementation,\n entryPoint07Abi,\n entryPoint07Address,\n getUserOperationHash,\n UserOperation,\n toSmartAccount,\n} from \"viem/account-abstraction\";\nimport { readContract } from \"viem/actions\";\nimport { type WebAuthnData, parseSignature as parseP256Signature, Hex } from \"webauthn-p256\";\n\nexport type ToCoinbaseSmartAccountParameters = {\n address?: Address | undefined;\n client: Client;\n owners: readonly OneOf<LocalAccount | WebAuthnAccount>[];\n nonce?: bigint | undefined;\n signer?: OneOf<LocalAccount | WebAuthnAccount>;\n};\n\nexport type ToCoinbaseSmartAccountReturnType = Prettify<SmartAccount<CoinbaseSmartAccountImplementation>>;\n\nexport type CoinbaseSmartAccountImplementation = Assign<\n SmartAccountImplementation<\n typeof entryPoint07Abi,\n \"0.7\",\n {\n __isCoinbaseSmartAccount: true;\n abi: typeof abi;\n factory: { abi: typeof factoryAbi; address: Address };\n signer: OneOf<LocalAccount | WebAuthnAccount>;\n }\n >,\n {\n sign: NonNullable<SmartAccountImplementation[\"sign\"]>;\n // TODO: should this be inside `extend` of `SmartAccountImplementation`?\n isOwner: (account: LocalAccount | WebAuthnAccount) => Promise<boolean>;\n }\n>;\n\n/**\n * @description Create a Coinbase Smart Account.\n *\n * @param parameters - {@link ToCoinbaseSmartAccountParameters}\n * @returns Coinbase Smart Account. {@link ToCoinbaseSmartAccountReturnType}\n *\n * @example\n * import { toCoinbaseSmartAccount } from 'viem/account-abstraction'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { client } from './client.js'\n *\n * const account = toCoinbaseSmartAccount({\n * client,\n * owners: [privateKeyToAccount('0x...')],\n * })\n */\nexport async function toCoinbaseSmartAccount(\n parameters: ToCoinbaseSmartAccountParameters,\n): Promise<ToCoinbaseSmartAccountReturnType> {\n const { client, owners, nonce = 0n } = parameters;\n\n let address = parameters.address;\n\n const entryPoint = {\n abi: entryPoint07Abi,\n address: entryPoint07Address,\n version: \"0.7\",\n } as const;\n const factory = {\n abi: factoryAbi,\n // TODO: make configurable?\n address: \"0x356336adA1619BeC1Ae4E6D94Dd9c0490DA414a8\",\n } as const;\n\n if (!owners.length) {\n throw new Error(\"`owners` must have at least one account.\");\n }\n\n function accountToBytes(account: LocalAccount | WebAuthnAccount) {\n return account.type === \"webAuthn\" ? account.publicKey : pad(account.address);\n }\n\n const owner = parameters.signer ?? owners[0];\n const ownerIndex = owners.indexOf(owner);\n if (ownerIndex === -1) {\n throw new Error(\"`signer` must be one of `owners`.\");\n }\n\n let counter = 0n;\n\n return toSmartAccount({\n client,\n entryPoint,\n\n extend: {\n __isCoinbaseSmartAccount: true as const,\n abi,\n factory,\n signer: owner,\n },\n\n async encodeCalls(calls) {\n if (calls.length === 1)\n return encodeFunctionData({\n abi,\n functionName: \"execute\",\n args: [calls[0].to, calls[0].value ?? 0n, calls[0].data ?? \"0x\"],\n });\n return encodeFunctionData({\n abi,\n functionName: \"executeBatch\",\n args: [\n calls.map((call) => ({\n data: call.data ?? \"0x\",\n target: call.to,\n value: call.value ?? 0n,\n })),\n ],\n });\n },\n\n async getAddress() {\n address ??= await readContract(client, {\n ...factory,\n functionName: \"getAddress\",\n args: [owners.map(accountToBytes), nonce],\n });\n return address;\n },\n\n async getNonce() {\n // allows for 256 nonces per ms\n const counterBits = 8n;\n counter = (counter + 1n) % (1n << counterBits);\n\n const timestamp = BigInt(Date.now());\n const nonce = ((timestamp << counterBits) + counter) << 64n;\n\n return nonce;\n },\n\n async getFactoryArgs() {\n const factoryData = encodeFunctionData({\n abi: factory.abi,\n functionName: \"createAccount\",\n args: [owners.map(accountToBytes), nonce],\n });\n return { factory: factory.address, factoryData };\n },\n\n async getStubSignature() {\n if (owner.type === \"webAuthn\")\n // eslint-disable-next-line max-len\n return \"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000\";\n return wrapSignature({\n signature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n ownerIndex,\n });\n },\n\n async sign(parameters) {\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: parameters.hash,\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signMessage(parameters) {\n const { message } = parameters;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashMessage(message),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signTypedData(parameters) {\n const { domain, types, primaryType, message } = parameters as TypedDataDefinition<TypedData, string>;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashTypedData({\n domain,\n message,\n primaryType,\n types,\n }),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signUserOperation(parameters) {\n const { chainId = client.chain!.id, ...userOperation } = parameters;\n\n const address = await this.getAddress();\n const hash = getUserOperationHash({\n chainId,\n entryPointAddress: entryPoint.address,\n entryPointVersion: entryPoint.version,\n userOperation: {\n ...(userOperation as unknown as UserOperation),\n sender: address,\n },\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n userOperation: {\n async estimateGas(userOperation) {\n if (owner.type !== \"webAuthn\") return;\n\n // Accounts with WebAuthn owner require a minimum verification gas limit of 800,000.\n return {\n verificationGasLimit: BigInt(Math.max(Number(userOperation.verificationGasLimit ?? 0n), 800_000)),\n };\n },\n },\n\n async isOwner(account: LocalAccount | WebAuthnAccount) {\n return await readContract(client, {\n abi,\n address: await this.getAddress(),\n functionName: \"isOwnerBytes\",\n args: [accountToBytes(account)],\n });\n },\n });\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Utilities\n/////////////////////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport async function sign({ hash, owner }: { hash: Hash; owner: OneOf<LocalAccount | WebAuthnAccount> }) {\n // WebAuthn Account (Passkey)\n if (owner.type === \"webAuthn\") {\n const { signature, webauthn } = await owner.sign({\n hash,\n });\n return toWebAuthnSignature({ signature, webauthn });\n }\n\n if (owner.sign) return owner.sign({ hash });\n\n throw new BaseError(\"`owner` does not support raw sign.\");\n}\n\n/** @internal */\nexport function toReplaySafeHash({ address, chainId, hash }: { address: Address; chainId: number; hash: Hash }) {\n return hashTypedData({\n domain: {\n chainId,\n name: \"Coinbase Smart Wallet\",\n verifyingContract: address,\n version: \"1\",\n },\n types: {\n CoinbaseSmartWalletMessage: [\n {\n name: \"hash\",\n type: \"bytes32\",\n },\n ],\n },\n primaryType: \"CoinbaseSmartWalletMessage\",\n message: {\n hash,\n },\n });\n}\n\n/** @internal */\nexport function toWebAuthnSignature({ webauthn, signature }: { webauthn: WebAuthnData; signature: Hex }) {\n const { r, s } = parseP256Signature(signature);\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"authenticatorData\",\n type: \"bytes\",\n },\n { name: \"clientDataJSON\", type: \"bytes\" },\n { name: \"challengeIndex\", type: \"uint256\" },\n { name: \"typeIndex\", type: \"uint256\" },\n {\n name: \"r\",\n type: \"uint256\",\n },\n {\n name: \"s\",\n type: \"uint256\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n authenticatorData: webauthn.authenticatorData,\n clientDataJSON: stringToHex(webauthn.clientDataJSON),\n challengeIndex: BigInt(webauthn.challengeIndex),\n typeIndex: BigInt(webauthn.typeIndex),\n r,\n s,\n },\n ],\n );\n}\n\n/** @internal */\nexport function wrapSignature(parameters: { ownerIndex: number; signature: Hex }) {\n const { ownerIndex } = parameters;\n const signatureData = (() => {\n if (size(parameters.signature) !== 65) return parameters.signature;\n const signature = parseSignature(parameters.signature);\n return encodePacked([\"bytes32\", \"bytes32\", \"uint8\"], [signature.r, signature.s, signature.yParity === 0 ? 27 : 28]);\n })();\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"ownerIndex\",\n type: \"uint8\",\n },\n {\n name: \"signatureData\",\n type: \"bytes\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n ownerIndex,\n signatureData,\n },\n ],\n );\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Constants\n/////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const abi = [\n { inputs: [], stateMutability: \"nonpayable\", type: \"constructor\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"AlreadyOwner\",\n type: \"error\",\n },\n { inputs: [], name: \"Initialized\", type: \"error\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidEthereumAddressOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"key\", type: \"uint256\" }],\n name: \"InvalidNonceKey\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidOwnerBytesLength\",\n type: \"error\",\n },\n { inputs: [], name: \"LastOwner\", type: \"error\" },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"NoOwnerAtIndex\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"ownersRemaining\", type: \"uint256\" }],\n name: \"NotLastOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"selector\", type: \"bytes4\" }],\n name: \"SelectorNotAllowed\",\n type: \"error\",\n },\n { inputs: [], name: \"Unauthorized\", type: \"error\" },\n { inputs: [], name: \"UnauthorizedCallContext\", type: \"error\" },\n { inputs: [], name: \"UpgradeFailed\", type: \"error\" },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"expectedOwner\", type: \"bytes\" },\n { name: \"actualOwner\", type: \"bytes\" },\n ],\n name: \"WrongOwnerAtIndex\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"AddOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"RemoveOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"implementation\",\n type: \"address\",\n },\n ],\n name: \"Upgraded\",\n type: \"event\",\n },\n { stateMutability: \"payable\", type: \"fallback\" },\n {\n inputs: [],\n name: \"REPLAYABLE_NONCE_KEY\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owner\", type: \"address\" }],\n name: \"addOwnerAddress\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"addOwnerPublicKey\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"functionSelector\", type: \"bytes4\" }],\n name: \"canSkipChainIdValidation\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"domainSeparator\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"eip712Domain\",\n outputs: [\n { name: \"fields\", type: \"bytes1\" },\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"extensions\", type: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"entryPoint\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"execute\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"executeBatch\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"calls\", type: \"bytes[]\" }],\n name: \"executeWithoutChainIdValidation\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n ],\n name: \"getUserOpHashWithoutChainId\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"$\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owners\", type: \"bytes[]\" }],\n name: \"initialize\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"isOwnerAddress\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"bytes\" }],\n name: \"isOwnerBytes\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"isOwnerPublicKey\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"hash\", type: \"bytes32\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"isValidSignature\",\n outputs: [{ name: \"result\", type: \"bytes4\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextOwnerIndex\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"ownerAtIndex\",\n outputs: [{ name: \"\", type: \"bytes\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ownerCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"proxiableUUID\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeLastOwner\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeOwnerAtIndex\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"removedOwnersCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"hash\", type: \"bytes32\" }],\n name: \"replaySafeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"newImplementation\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"upgradeToAndCall\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n { name: \"userOpHash\", type: \"bytes32\" },\n { name: \"missingAccountFunds\", type: \"uint256\" },\n ],\n name: \"validateUserOp\",\n outputs: [{ name: \"validationData\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n { stateMutability: \"payable\", type: \"receive\" },\n] as const;\n\nconst factoryAbi = [\n {\n inputs: [{ name: \"implementation_\", type: \"address\" }],\n stateMutability: \"payable\",\n type: \"constructor\",\n },\n { inputs: [], name: \"OwnerRequired\", type: \"error\" },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"createAccount\",\n outputs: [\n {\n name: \"account\",\n type: \"address\",\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"getAddress\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"initCodeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { bytesToHex, hashMessage } from \"viem\";\nimport { sign } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { recoverPasskeyPublicKey } from \"./recoverPasskeyPublicKey\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function reusePasskey(): Promise<P256Credential> {\n const randomChallenge = bytesToHex(crypto.getRandomValues(new Uint8Array(256)));\n const messageHash = hashMessage(randomChallenge);\n const { signature, webauthn, raw: credential } = await sign({ hash: messageHash });\n\n const publicKey = await (async () => {\n const publicKey = cache.getState().publicKeys[credential.id];\n if (publicKey) return publicKey;\n\n // TODO: look up account/public key by credential ID once we store it onchain\n\n const webauthnHash = await getMessageHash(webauthn);\n const passkey = await recoverPasskeyPublicKey({\n credentialId: credential.id,\n messageHash: webauthnHash,\n signatureHex: signature,\n });\n if (!passkey) {\n throw new Error(\"recovery failed\");\n }\n if (passkey.credential.id !== credential.id) {\n throw new Error(\"wrong credential\");\n }\n\n cache.setState((state) => ({\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: passkey.publicKey,\n },\n }));\n\n return passkey.publicKey;\n })();\n\n console.log(\"recovered passkey\", credential.id, publicKey);\n\n cache.setState(() => ({\n activeCredential: credential.id,\n }));\n\n return { id: credential.id, publicKey, raw: credential };\n}\n","import { bytesToHex, Hex, hexToBytes, WebAuthnData } from \"webauthn-p256\";\nimport { concatBytes, utf8ToBytes } from \"@noble/curves/abstract/utils\";\n\n// lifted out of https://github.com/wevm/webauthn-p256/blob/main/src/verify.ts\n// TODO: submit a PR to lift this out as a function that can be exported\n\nexport async function getMessageHash(\n webauthn: Omit<WebAuthnData, \"typeIndex\" | \"challengeIndex\"> & {\n challengeIndex?: number;\n typeIndex?: number;\n },\n): Promise<Hex | never> {\n const {\n authenticatorData,\n challengeIndex: challengeIndexRaw,\n clientDataJSON,\n typeIndex: typeIndexRaw,\n userVerificationRequired,\n } = webauthn;\n\n const typeIndex = typeIndexRaw || clientDataJSON.indexOf('\"type\"');\n const challengeIndex = challengeIndexRaw || clientDataJSON.indexOf('\"challenge\"');\n\n const authenticatorDataBytes = hexToBytes(authenticatorData);\n\n // Check length of `authenticatorData`.\n if (authenticatorDataBytes.length < 37) throw new Error(\"Invalid authenticatorData\");\n\n const flag = authenticatorDataBytes[32]!;\n\n // Verify that the UP bit of the flags in authData is set.\n if ((flag & 0x01) !== 0x01) throw new Error(\"Invalid authenticatorData\");\n\n // If user verification was determined to be required, verify that\n // the UV bit of the flags in authData is set. Otherwise, ignore the\n // value of the UV flag.\n if (userVerificationRequired && (flag & 0x04) !== 0x04) throw new Error(\"Invalid authenticatorData\");\n\n // If the BE bit of the flags in authData is not set, verify that\n // the BS bit is not set.\n if ((flag & 0x08) !== 0x08 && (flag & 0x10) === 0x10) throw new Error(\"Invalid authenticatorData\");\n\n // Check that response is for an authentication assertion\n const type = '\"type\":\"webauthn.get\"';\n if (type !== clientDataJSON.slice(Number(typeIndex), type.length + 1)) throw new Error(\"Invalid clientDataJSON\");\n\n // Check that hash is in the clientDataJSON.\n const match = clientDataJSON.slice(Number(challengeIndex)).match(/^\"challenge\":\"(.*?)\"/);\n if (!match) throw new Error(\"Invalid clientDataJSON\");\n\n const clientDataJSONHash = new Uint8Array(await crypto.subtle.digest(\"SHA-256\", utf8ToBytes(clientDataJSON)));\n const messageHash = new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", concatBytes(hexToBytes(authenticatorData), clientDataJSONHash)),\n );\n\n return bytesToHex(messageHash);\n}\n","import { sign } from \"webauthn-p256\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { getCandidatePublicKeys } from \"./getCandidatePublicKeys\";\nimport { SignatureAndMessage } from \"./common\";\nimport { hashMessage, Hex } from \"viem\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport function findPublicKey([input1, input2]: [SignatureAndMessage, SignatureAndMessage]): Hex | undefined {\n // Return the candidate public key that appears twice\n return firstDuplicate([...getCandidatePublicKeys(input1), ...getCandidatePublicKeys(input2)]);\n}\n\nexport async function recoverPasskeyPublicKey(input: { credentialId: P256Credential[\"id\"] } & SignatureAndMessage) {\n const message2 = hashMessage(input.signatureHex);\n const {\n signature: signature2,\n webauthn: webauthn2,\n raw: credential,\n } = await sign({ credentialId: input.credentialId, hash: message2 });\n const messageHash2 = await getMessageHash(webauthn2);\n\n const publicKey = findPublicKey([input, { signatureHex: signature2, messageHash: messageHash2 }]);\n if (publicKey) {\n return { publicKey, credential };\n }\n}\n\nfunction firstDuplicate<T>(arr: T[]): T | undefined {\n const seen = new Set<T>();\n for (const s of arr) {\n if (seen.has(s)) {\n return s;\n }\n seen.add(s);\n }\n return undefined;\n}\n","import { parseSignature, serializePublicKey } from \"webauthn-p256\";\nimport { SignatureAndMessage } from \"./common\";\nimport { secp256r1 } from \"@noble/curves/p256\";\n\nexport function getCandidatePublicKeys(input: SignatureAndMessage) {\n const { r, s } = parseSignature(input.signatureHex);\n\n const candidate1 = new secp256r1.Signature(r, s).addRecoveryBit(1).recoverPublicKey(input.messageHash.slice(2));\n const candidate2 = new secp256r1.Signature(r, s).addRecoveryBit(0).recoverPublicKey(input.messageHash.slice(2));\n\n return [serializePublicKey(candidate1), serializePublicKey(candidate2)];\n}\n","import { createCredential } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function createPasskey(): Promise<P256Credential> {\n const credential = await createCredential({ name: \"MUD Account\" });\n console.log(\"created passkey\", credential);\n\n cache.setState((state) => ({\n activeCredential: credential.id,\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: credential.publicKey,\n },\n }));\n\n return credential;\n}\n","import { resourceToHex } from \"@latticexyz/common\";\nimport { Client, Chain, Transport, Account, parseAbi, ClientConfig, Address } from \"viem\";\nimport worldConfig from \"@latticexyz/world/mud.config\";\n\nexport type ConnectedClient<chain extends Chain = Chain> = Client<Transport, chain, Account>;\nexport type SessionClient<chain extends Chain = Chain> = ConnectedClient<chain> & { readonly userAddress: Address };\n\nexport const defaultClientConfig = {\n pollingInterval: 250,\n} as const satisfies Pick<ClientConfig, \"pollingInterval\">;\n\nexport const unlimitedDelegationControlId = resourceToHex({ type: \"system\", namespace: \"\", name: \"unlimited\" });\n\nexport const worldTables = worldConfig.namespaces.world.tables;\n\nexport const worldAbi = parseAbi([\n \"function registerDelegation(address delegatee, bytes32 delegationControlId, bytes initCallData)\",\n]);\n","import { Transport, Chain, Client, RpcSchema, Address } from \"viem\";\nimport {\n BundlerClient,\n BundlerClientConfig,\n SmartAccount,\n createBundlerClient as viem_createBundlerClient,\n} from \"viem/account-abstraction\";\nimport { defaultClientConfig } from \"./common\";\n\nconst knownChainFees = new Set([\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 31337,\n // rhodolite\n 17420,\n // garnet\n 17069,\n // redstone\n 690,\n]);\n\nexport function createBundlerClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n account extends SmartAccount | undefined = undefined,\n client extends Client | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>({\n paymasterAddress,\n ...config\n}: BundlerClientConfig<transport, chain, account, client, rpcSchema> & { paymasterAddress: Address }): BundlerClient<\n transport,\n chain,\n account,\n client,\n rpcSchema\n> {\n const chain = config.chain ?? config.client?.chain;\n return viem_createBundlerClient({\n ...defaultClientConfig,\n paymaster: {\n getPaymasterData: async () => ({\n // TODO: source this from the chain config instead\n paymaster: paymasterAddress,\n paymasterData: \"0x\",\n }),\n },\n userOperation: {\n estimateFeesPerGas:\n // TODO: source this from the chain config instead\n chain && knownChainFees.has(chain.id)\n ? async () => ({\n maxFeePerGas: 100_000n,\n maxPriorityFeePerGas: 0n,\n })\n : undefined,\n },\n ...config,\n });\n}\n","import { transactionQueue } from \"@latticexyz/common/actions\";\nimport { Chain, createClient, fallback, http, webSocket } from \"viem\";\nimport { privateKeyToAccount, generatePrivateKey } from \"viem/accounts\";\nimport { userOpExecutor } from \"./transports/userOpExecutor\";\nimport { gasEstimator } from \"./transports/gasEstimator\";\nimport { wiresaw } from \"./transports/wiresaw\";\n\nexport function getBundlerTransport(chain: Chain) {\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n const bundlerTransport = chain.rpcUrls.bundler?.http[0]\n ? wiresaw(gasEstimator(http(bundlerHttpUrl)))\n : chain.id === 31337\n ? userOpExecutor({\n executor: createClient({\n chain,\n transport: fallback([webSocket(), http()]),\n account: privateKeyToAccount(generatePrivateKey()),\n }).extend(transactionQueue()),\n })\n : null;\n if (!bundlerTransport) {\n throw new Error(`Chain ${chain.id} config did not include a bundler RPC URL.`);\n }\n return bundlerTransport;\n}\n","import {\n BundlerRpcSchema,\n EIP1193RequestFn,\n Hash,\n RpcUserOperationReceipt,\n Transport,\n createTransport,\n numberToHex,\n} from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\nimport { TransportRequestFn } from \"./common\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { sendUserOperation } from \"./methods/sendUserOperation\";\nimport { ConnectedClient } from \"../common\";\n\nexport function userOpExecutor({ executor }: { executor: ConnectedClient }): Transport {\n return () => {\n const receipts = new Map<Hash, RpcUserOperationReceipt<\"0.7\">>();\n\n const request: TransportRequestFn<BundlerRpcSchema> = async ({ method, params }) => {\n // TODO: move chain/ID into args and executors as accounts instead of clients?\n if (method === \"eth_chainId\") {\n return numberToHex(executor.chain.id);\n }\n\n if (method === \"eth_supportedEntryPoints\") {\n return [entryPoint07Address];\n }\n\n if (method === \"eth_sendUserOperation\") {\n const [rpcUserOp, entrypoint] = params;\n if (entrypoint === entryPoint07Address) {\n const result = await sendUserOperation({ executor, rpcUserOp });\n receipts.set(result.userOpHash, result as RpcUserOperationReceipt<\"0.7\">);\n return result.userOpHash;\n }\n }\n\n if (method === \"eth_getUserOperationReceipt\") {\n const [hash] = params;\n return receipts.get(hash) ?? null;\n }\n\n if (method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas(params);\n }\n\n throw new Error(\"Not implemented\");\n };\n\n return createTransport({\n key: \"userOpExecutor\",\n type: \"userOpExecutor\",\n name: \"User Operation Executor Transport\",\n request: request as EIP1193RequestFn,\n });\n };\n}\n","import { BundlerRpcSchema } from \"viem\";\nimport { formatUserOperationRequest } from \"viem/account-abstraction\";\nimport { RpcMethod } from \"../common\";\n\ntype rpcMethod = RpcMethod<BundlerRpcSchema, \"eth_estimateUserOperationGas\">;\n\nexport async function estimateUserOperationGas(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _params: rpcMethod[\"Parameters\"],\n): Promise<rpcMethod[\"ReturnType\"]> {\n return formatUserOperationRequest({\n callGasLimit: 1_000_000n,\n preVerificationGas: 100_000n,\n verificationGasLimit: 1_000_000n,\n paymasterVerificationGasLimit: 100_000n,\n paymasterPostOpGasLimit: 100_000n,\n });\n}\n","import { Client, Transport, Chain, Account, RpcUserOperation, RpcUserOperationReceipt, parseEther } from \"viem\";\nimport {\n formatUserOperation,\n toPackedUserOperation,\n getUserOperationHash,\n entryPoint07Address,\n entryPoint07Abi,\n} from \"viem/account-abstraction\";\nimport { setBalance, writeContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\n// TODO: move this into a generic to support other versions?\nconst entryPointVersion = \"0.7\";\ntype entryPointVersion = typeof entryPointVersion;\n\nexport async function sendUserOperation({\n executor,\n rpcUserOp,\n}: {\n executor: Client<Transport, Chain, Account>;\n rpcUserOp: RpcUserOperation<entryPointVersion>;\n}): Promise<\n Pick<RpcUserOperationReceipt<entryPointVersion>, \"success\" | \"userOpHash\"> & {\n receipt: Pick<RpcUserOperationReceipt<entryPointVersion>[\"receipt\"], \"transactionHash\">;\n }\n> {\n if (executor.chain.id === 31337) {\n await setBalance(\n executor.extend(() => ({ mode: \"anvil\" })),\n {\n address: executor.account.address,\n value: parseEther(\"100\"),\n },\n );\n }\n\n const userOp = formatUserOperation(rpcUserOp);\n const gas =\n userOp.preVerificationGas +\n userOp.verificationGasLimit +\n (userOp.paymasterVerificationGasLimit ?? 0n) +\n (userOp.paymasterPostOpGasLimit ?? 0n) +\n userOp.callGasLimit;\n\n const packedUserOp = toPackedUserOperation(userOp);\n\n const userOpHash = getUserOperationHash({\n userOperation: userOp,\n chainId: executor.chain.id,\n entryPointVersion: \"0.7\",\n entryPointAddress: entryPoint07Address,\n });\n\n const transactionHash = await getAction(\n executor,\n writeContract,\n \"writeContract\",\n )({\n abi: entryPoint07Abi,\n address: entryPoint07Address,\n functionName: \"handleOps\",\n args: [[packedUserOp], executor.account.address],\n chain: executor.chain,\n account: executor.account,\n gas,\n });\n\n return {\n success: true,\n userOpHash,\n receipt: { transactionHash },\n };\n}\n","import { BundlerRpcSchema, Transport } from \"viem\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { TransportRequestFn, getRpcSchema } from \"./common\";\n\nexport function gasEstimator<const transport extends Transport>(getTransport: transport): transport {\n return ((opts) => {\n const { request: originalRequest, ...rest } = getTransport(opts);\n\n const request: TransportRequestFn<getRpcSchema<BundlerRpcSchema, \"eth_estimateUserOperationGas\">> = async (\n { method, params },\n options,\n ) => {\n if (method === \"eth_estimateUserOperationGas\") {\n return estimateUserOperationGas(params);\n }\n return originalRequest({ method, params }, options);\n };\n\n return { request, ...rest };\n }) as transport;\n}\n","import {\n BundlerRpcSchema,\n Hash,\n Hex,\n PublicRpcSchema,\n RpcTransactionReceipt,\n RpcUserOperationReceipt,\n Transport,\n http,\n} from \"viem\";\nimport { getRpcMethod, getRpcSchema, TransportRequestFn, TransportRequestFnMapped } from \"./common\";\n\nexport type WiresawRpcSchema = [\n {\n Method: \"wiresaw_call\";\n Parameters: getRpcMethod<PublicRpcSchema, \"eth_call\">[\"Parameters\"];\n ReturnType: getRpcMethod<PublicRpcSchema, \"eth_call\">[\"ReturnType\"];\n },\n {\n Method: \"wiresaw_sendUserOperation\";\n Parameters: getRpcMethod<BundlerRpcSchema, \"eth_sendUserOperation\">[\"Parameters\"];\n ReturnType: {\n userOpHash: Hex;\n txHash: Hex;\n };\n },\n];\n\nexport type OverriddenMethods = [\n ...getRpcSchema<PublicRpcSchema, \"eth_chainId\" | \"eth_call\" | \"eth_getTransactionReceipt\">,\n ...getRpcSchema<BundlerRpcSchema, \"eth_sendUserOperation\" | \"eth_getUserOperationReceipt\">,\n];\n\nexport function wiresaw<const transport extends Transport>(getTransport: transport): transport {\n return ((args) => {\n const getWiresawTransport =\n args.chain?.rpcUrls && \"wiresaw\" in args.chain.rpcUrls ? http(args.chain.rpcUrls.wiresaw.http[0]) : undefined;\n if (!getWiresawTransport) return getTransport(args);\n\n const transport = getTransport(args) as { request: TransportRequestFn<OverriddenMethods> };\n const wiresawTransport = getWiresawTransport(args) as { request: TransportRequestFn<WiresawRpcSchema> };\n\n let chainId: Hex | null = null;\n const receipts = new Map<Hash, RpcTransactionReceipt>();\n const userOpReceipts = new Map<Hash, RpcUserOperationReceipt>();\n\n const request: TransportRequestFnMapped<OverriddenMethods> = async ({ method, params }, opts) => {\n if (method === \"eth_chainId\") {\n if (chainId != null) return chainId;\n return (chainId = await transport.request({ method, params }, opts));\n }\n\n // TODO: only route to wiresaw if using pending block tag\n if (method === \"eth_call\") {\n return wiresawTransport.request({ method: \"wiresaw_call\", params });\n }\n\n if (method === \"eth_getTransactionReceipt\") {\n const [hash] = params;\n const receipt = receipts.get(hash) ?? (await transport.request({ method, params }));\n if (!receipts.has(hash) && receipt) receipts.set(hash, receipt);\n return receipt;\n }\n\n if (method === \"eth_sendUserOperation\") {\n const result = await wiresawTransport.request({\n method: \"wiresaw_sendUserOperation\",\n params,\n });\n // :haroldsmile:\n userOpReceipts.set(result.userOpHash, {\n success: true,\n userOpHash: result.userOpHash,\n receipt: { transactionHash: result.txHash },\n } as RpcUserOperationReceipt);\n return result.userOpHash;\n }\n\n if (method === \"eth_getUserOperationReceipt\") {\n const [hash] = params;\n const receipt = userOpReceipts.get(hash) ?? (await transport.request({ method, params }));\n if (!userOpReceipts.has(hash) && receipt) userOpReceipts.set(hash, receipt);\n return receipt;\n }\n\n return await transport.request({ method, params }, opts);\n };\n\n return { ...transport, request };\n }) as transport;\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: [\"preloadImage\", 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, 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=\"text-2xl text-white text-center\">{appName}</div>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { twMerge } from \"tailwind-merge\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Wallet } from \"./Wallet\";\nimport { Allowance } from \"./Allowance\";\nimport { Session } from \"./Session\";\nimport { Step } from \"./common\";\nimport { Address } from \"viem\";\nimport { useAccountModal } from \"../useAccountModal\";\n\nexport type Props = {\n userClient: ConnectedClient;\n initialUserAddress: Address | undefined;\n};\n\nexport function ConnectedSteps({ userClient, initialUserAddress }: Props) {\n const userAddress = userClient.account.address;\n const { data: prerequisites } = usePrerequisites(userAddress);\n\n const { closeAccountModal } = useAccountModal();\n const isNewConnection = userAddress !== initialUserAddress;\n\n const initialPrerequisites = useRef(prerequisites);\n useEffect(() => {\n if (prerequisites == null) return;\n if (initialPrerequisites.current == null) {\n initialPrerequisites.current = prerequisites;\n }\n\n if (prerequisites.complete) {\n if (isNewConnection || !initialPrerequisites.current.complete) {\n closeAccountModal();\n }\n }\n }, [closeAccountModal, isNewConnection, prerequisites]);\n\n const { hasAllowance, isSpender, hasDelegation } = prerequisites ?? {};\n\n const steps = useMemo((): readonly Step[] => {\n if (!userAddress) {\n return [\n {\n id: \"wallet\",\n isComplete: false,\n content: () => null,\n },\n ];\n }\n\n return [\n {\n id: \"wallet\",\n isComplete: true,\n content: (props) => <Wallet {...props} userAddress={userAddress} />,\n },\n {\n id: \"allowance\",\n isComplete: !!hasAllowance,\n content: (props) => <Allowance {...props} userAddress={userAddress} />,\n },\n {\n id: \"session\",\n isComplete: !!isSpender && !!hasDelegation,\n content: (props) => (\n <Session\n {...props}\n userClient={userClient}\n registerSpender={!isSpender}\n registerDelegation={!hasDelegation}\n />\n ),\n },\n ];\n }, [hasAllowance, hasDelegation, isSpender, userAddress, userClient]);\n\n const [selectedStepId] = 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 const activeStepIndex = activeStep ? steps.indexOf(activeStep) : -1;\n\n return (\n <div\n className={twMerge(\n \"min-h-[26rem] px-8 flex flex-col divide-y divide-neutral-800\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\",\n )}\n >\n {steps.map((step, i) => {\n const isActive = step === activeStep;\n const isExpanded = isActive || completedSteps.length === steps.length;\n const isDisabled = !step.isComplete && activeStepIndex !== -1 && i > activeStepIndex;\n return (\n <div key={step.id} className={twMerge(\"py-8 flex flex-col justify-center\", isActive ? \"flex-grow\" : null)}>\n <div className={twMerge(\"flex flex-col\", isDisabled ? \"opacity-30 pointer-events-none\" : null)}>\n {step.content({ isActive, isExpanded })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { parseEther } from \"viem\";\n\nexport type Step = {\n id: string;\n isComplete: boolean;\n content: (props: { isActive: boolean; isExpanded: boolean }) => ReactNode;\n};\n\nexport const minGasBalance = parseEther(\"0.01\");\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getAllowance } from \"./getAllowance\";\n\nexport function getAllowanceQueryOptions({\n client,\n paymasterAddress,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n paymasterAddress: Address;\n userAddress: Address | undefined;\n}) {\n const queryKey = [\"getAllowance\", client?.chain.id, paymasterAddress, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getAllowance({ client, paymasterAddress, userAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useAllowance(userAddress: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getAllowanceQueryOptions({ client, paymasterAddress, userAddress }));\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: whole ABI\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 { Address, Client, Hex } from \"viem\";\nimport { Table } from \"@latticexyz/config\";\nimport {\n decodeValueArgs,\n getKeySchema,\n getKeyTuple,\n getSchemaPrimitives,\n getSchemaTypes,\n getValueSchema,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { readContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\n// TODO: move this to store package or similar\n\nexport type GetRecordOptions<table extends Table> = {\n address: Address;\n table: table;\n key: getSchemaPrimitives<getKeySchema<table>>;\n blockTag?: \"latest\" | \"pending\";\n};\n\nexport async function getRecord<table extends Table>(\n client: Client,\n { address, table, key, blockTag }: GetRecordOptions<table>,\n): Promise<getSchemaPrimitives<table[\"schema\"]>> {\n const [staticData, encodedLengths, dynamicData] = await getAction(\n client,\n readContract,\n \"readContract\",\n )({\n address,\n abi,\n functionName: \"getRecord\",\n args: [table.tableId, getKeyTuple(table, key) as readonly Hex[]],\n blockTag,\n });\n\n return {\n ...key,\n ...decodeValueArgs(getSchemaTypes(getValueSchema(table)), { staticData, encodedLengths, dynamicData }),\n };\n}\n\nconst abi = [\n {\n type: \"function\",\n name: \"getRecord\",\n inputs: [\n {\n name: \"tableId\",\n type: \"bytes32\",\n internalType: \"ResourceId\",\n },\n {\n name: \"keyTuple\",\n type: \"bytes32[]\",\n internalType: \"bytes32[]\",\n },\n ],\n outputs: [\n {\n name: \"staticData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"encodedLengths\",\n type: \"bytes32\",\n internalType: \"EncodedLengths\",\n },\n {\n name: \"dynamicData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"../paymaster\";\nimport { getRecord } from \"../utils/getRecord\";\n\nexport type GetAllowanceParams = {\n client: Client<Transport, Chain>;\n paymasterAddress: Address;\n userAddress: Address;\n};\n\nexport async function getAllowance({ client, paymasterAddress, userAddress }: GetAllowanceParams) {\n const record = await getRecord(client, {\n address: paymasterAddress,\n table: paymasterTables.Allowance,\n key: { user: userAddress },\n blockTag: \"pending\",\n });\n return record.allowance;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getSpender } from \"./getSpender\";\n\nexport function getSpenderQueryOptions({\n client,\n paymasterAddress,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n paymasterAddress: Address;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n const queryKey = [\"getSpender\", client?.chain.id, paymasterAddress, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getSpender({ client, paymasterAddress, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useSpender(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSpenderQueryOptions({ client, paymasterAddress, userAddress, sessionAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"../paymaster\";\nimport { getRecord } from \"../utils/getRecord\";\n\nexport type GetSpenderParams = {\n client: Client<Transport, Chain>;\n paymasterAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n};\n\nexport async function getSpender({ client, paymasterAddress, userAddress, sessionAddress }: GetSpenderParams) {\n const record = await getRecord(client, {\n address: paymasterAddress,\n table: paymasterTables.Spender,\n key: { spender: sessionAddress },\n blockTag: \"pending\",\n });\n return record.user.toLowerCase() === userAddress.toLowerCase();\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getDelegation } from \"./getDelegation\";\n\nexport function getDelegationQueryOptions({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n worldAddress: Address;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n const queryKey = [\"getDelegation\", client?.chain.id, worldAddress, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getDelegation({ client, worldAddress, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useDelegation(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { getRecord } from \"../utils/getRecord\";\nimport { unlimitedDelegationControlId, worldTables } from \"../common\";\n\nexport type GetDelegationParams = {\n client: Client<Transport, Chain>;\n worldAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n};\n\nexport async function getDelegation({ client, worldAddress, userAddress, sessionAddress }: GetDelegationParams) {\n const record = await getRecord(client, {\n address: worldAddress,\n table: worldTables.UserDelegationControl,\n key: { delegator: userAddress, delegatee: sessionAddress },\n blockTag: \"pending\",\n });\n return record.delegationControlId === unlimitedDelegationControlId;\n}\n","import { minGasBalance } from \"./common\";\nimport { getAllowanceQueryOptions } from \"./useAllowance\";\nimport { getSpenderQueryOptions } from \"./useSpender\";\nimport { getDelegationQueryOptions } from \"./useDelegation\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { Address, Chain, Client, Transport } from \"viem\";\nimport { getSessionAccountQueryOptions } from \"../useSessionAccount\";\n\nexport function getPrequisitesQueryOptions({\n queryClient,\n client,\n userAddress,\n paymasterAddress,\n worldAddress,\n}: {\n queryClient: QueryClient;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n paymasterAddress: Address;\n worldAddress: Address;\n}) {\n const queryKey = [\"getPrerequisites\", client?.chain.id, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: async () => {\n const { address: sessionAddress } = await queryClient.fetchQuery(\n getSessionAccountQueryOptions({ client, userAddress }),\n );\n const [allowance, isSpender, hasDelegation] = await Promise.all([\n queryClient.fetchQuery(getAllowanceQueryOptions({ client, paymasterAddress, userAddress })),\n queryClient.fetchQuery(getSpenderQueryOptions({ client, paymasterAddress, userAddress, sessionAddress })),\n queryClient.fetchQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress })),\n ]);\n const hasAllowance = allowance >= minGasBalance;\n return {\n hasAllowance,\n isSpender,\n hasDelegation,\n complete: hasAllowance && isSpender && hasDelegation,\n };\n },\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function usePrerequisites(userAddress: Address | undefined) {\n const queryClient = useQueryClient();\n const { chainId, paymasterAddress, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n // TODO: rework this so it uses other hooks so we avoid having to clear two caches when e.g. topping up\n\n const prereqs = useQuery(\n getPrequisitesQueryOptions({\n queryClient,\n client,\n userAddress,\n paymasterAddress,\n worldAddress,\n }),\n queryClient,\n );\n // console.log(\"prereqs\", prereqs.isFetching, prereqs.isRefetching, prereqs.isFetchedAfterMount);\n return prereqs;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UseQueryResult, queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getSessionAccount } from \"./getSessionAccount\";\nimport { SmartAccount } from \"viem/account-abstraction\";\n\nexport function getSessionAccountQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n const queryKey = [\"getSessionAccount\", client?.chain.id, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getSessionAccount({ client, userAddress }),\n staleTime: Infinity,\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useSessionAccount(userAddress: Address | undefined): UseQueryResult<SmartAccount> {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSessionAccountQueryOptions({ userAddress, client }));\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { Address, Hex } from \"viem\";\n\nexport type State = {\n readonly signers: {\n readonly [key in Address]?: Hex;\n };\n};\n\nexport const store = createStore(\n persist<State>(\n () => ({\n signers: {},\n }),\n {\n name: \"mud:entrykit\",\n partialize: ({ signers }) => ({ signers }),\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 \"./store\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport function getSessionSigner(userAddress: Address) {\n const sessionSignerPrivateKey =\n store.getState().signers[userAddress] ??\n (() => {\n const privateKey = generatePrivateKey();\n store.setState((state) => ({\n signers: {\n ...state.signers,\n [userAddress]: privateKey,\n },\n }));\n return privateKey;\n })();\n\n return privateKeyToAccount(sessionSignerPrivateKey);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { getSessionSigner } from \"./getSessionSigner\";\nimport { toCoinbaseSmartAccount } from \"./smart-account/toCoinbaseSmartAccount\";\nimport { SmartAccount } from \"viem/account-abstraction\";\n\nexport async function getSessionAccount<chain extends Chain>({\n client,\n userAddress,\n}: {\n client: Client<Transport, chain>;\n userAddress: Address;\n}): Promise<SmartAccount> {\n const sessionSigner = getSessionSigner(userAddress);\n return await toCoinbaseSmartAccount({ client, owners: [sessionSigner] });\n}\n","import { useDisconnect } from \"wagmi\";\nimport { useENS } from \"../useENS\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { Button } from \"../ui/Button\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { Hex } from \"viem\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useDisconnect();\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\n // TODO: display disconnect error as popover near button?\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Account</div>\n <div className=\"font-mono text-white\">{ens?.name ?? <TruncatedHex hex={userAddress} />}</div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={disconnectIsPending}\n onClick={() => {\n closeAccountModal();\n disconnect();\n }}\n >\n Sign out\n </Button>\n </div>\n {isExpanded ? (\n <p className=\"text-sm\">Each of your onchain actions in this app is associated with your account.</p>\n ) : null}\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\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 { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { quarryPassIssuer } from \"../transports/quarryPassIssuer\";\n\nexport function useClaimGasPass() {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n\n const mutationKey = [\"claimGasPass\", chain.id];\n return useMutation({\n mutationKey,\n onError: (error) => console.error(error),\n mutationFn: async (userAddress: Address) => {\n const transport = quarryPassIssuer()({ chain });\n // TODO: handle case where you already have a pass?\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 Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getAllowance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n retry: 0,\n });\n}\n","import { Address, EIP1193RequestFn, Hex, Transport, http } from \"viem\";\n\nexport type QuarryPassIssuerRpcSchema = [\n {\n Method: \"quarry_issuePass\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n {\n Method: \"quarry_claimAllowance\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n];\n\nexport function quarryPassIssuer(): Transport<\"http\", {}, EIP1193RequestFn<QuarryPassIssuerRpcSchema>> {\n return ({ chain }) => {\n if (!chain) throw new Error(\"No chain provided to issuer transport.\");\n\n const url = \"quarryPassIssuer\" in chain.rpcUrls ? chain.rpcUrls.quarryPassIssuer.http[0] : undefined;\n // TODO: add fallback for anvil to do what quarryPassIssuer does internally\n if (!url) throw new Error(`No \\`quarryPassIssuer\\` RPC URL found for chain ${chain.id}.`);\n\n return http(url)({ chain, retryCount: 0 });\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 { 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\";\nimport { minGasBalance } from \"./common\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n userAddress: Hex;\n};\n\nexport function Allowance({ isActive, isExpanded, userAddress }: Props) {\n const allowance = useAllowance(userAddress);\n const claimGasPass = useClaimGasPass();\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (isActive && claimGasPass.status === \"idle\" && allowance.isSuccess && allowance.data < minGasBalance) {\n claimGasPass.mutate(userAddress);\n }\n });\n return () => clearTimeout(timer);\n }, [allowance.data, allowance.isSuccess, claimGasPass, isActive, userAddress]);\n\n // TODO: show error if allowance fails to load\n // TODO: show claim error\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Allowance</div>\n <div className=\"font-mono text-white\">\n {allowance.data != null ? <Balance wei={allowance.data} /> : <PendingIcon className=\"text-sm\" />}\n </div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={allowance.status === \"pending\" || claimGasPass.status === \"pending\"}\n onClick={() => claimGasPass.mutate(userAddress)}\n >\n Top up\n </Button>\n </div>\n {isExpanded ? <p className=\"text-sm\">Your allowance is used to pay for onchain computation.</p> : null}\n </div>\n );\n}\n","import { Hex, encodeFunctionData } 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\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\nimport { defineCall } from \"../utils/defineCall\";\nimport { useClient } from \"wagmi\";\nimport { resourceToHex } from \"@latticexyz/common\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\";\nimport { callWithSignature } from \"../utils/callWithSignature\";\n\nexport function useSetupSession({ userClient }: { userClient: ConnectedClient }) {\n const queryClient = useQueryClient();\n const { chainId, worldAddress, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const mutationKey = [\"setupSession\", client?.chain.id, userClient.account.address];\n return useMutation({\n mutationKey,\n onError: (error) => console.error(error),\n mutationFn: async ({\n sessionClient,\n registerSpender,\n registerDelegation,\n }: {\n sessionClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n }): Promise<void> => {\n if (!client) throw new Error(\"Client not ready.\");\n const sessionAddress = sessionClient.account.address;\n\n console.log(\"setting up session\");\n\n if (userClient.account.type !== \"smart\") {\n const txs: Hex[] = [];\n\n if (registerSpender) {\n console.log(\"registering spender\");\n const tx = await callWithSignature({\n client,\n userClient,\n sessionClient,\n worldAddress: paymasterAddress,\n systemId: resourceToHex({ type: \"system\", namespace: \"\", name: \"SpenderSystem\" }),\n callData: encodeFunctionData({\n abi: paymasterAbi,\n functionName: \"registerSpender\",\n args: [sessionAddress],\n }),\n });\n console.log(\"got spender tx\", tx);\n txs.push(tx);\n }\n\n if (registerDelegation) {\n console.log(\"registering delegation\");\n const tx = await callWithSignature({\n client,\n userClient,\n sessionClient,\n worldAddress,\n systemId: resourceToHex({ type: \"system\", namespace: \"\", name: \"Registration\" }),\n callData: encodeFunctionData({\n abi: IBaseWorldAbi,\n functionName: \"registerDelegation\",\n args: [sessionAddress, unlimitedDelegationControlId, \"0x\"],\n }),\n });\n console.log(\"got delegation tx\", tx);\n txs.push(tx);\n }\n\n if (!txs.length) return;\n\n console.log(\"waiting for\", txs.length, \"receipts\");\n for (const hash of txs) {\n const receipt = await getAction(client, waitForTransactionReceipt, \"waitForTransactionReceipt\")({ hash });\n console.log(\"got tx receipt\", receipt);\n if (receipt.status === \"reverted\") {\n console.error(\"tx reverted?\", receipt);\n }\n }\n } else {\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: [sessionAddress],\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: [sessionAddress, unlimitedDelegationControlId, \"0x\"],\n }),\n );\n }\n\n if (!calls.length) return;\n\n console.log(\"setting up account with\", calls, userClient);\n const hash = await getAction(userClient, sendUserOperation, \"sendUserOperation\")({ calls });\n console.log(\"got user op hash\", hash);\n\n const receipt = await getAction(\n userClient,\n waitForUserOperationReceipt,\n \"waitForUserOperationReceipt\",\n )({ hash });\n console.log(\"got user op receipt\", receipt);\n\n if (!receipt.success) {\n console.error(\"not successful?\", receipt);\n }\n }\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getSpender\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getDelegation\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n retry: 0,\n });\n}\n","import { Chain } from \"viem\";\nimport { writeContract as viem_writeContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\nimport { SignCallOptions, signCall } from \"./signCall\";\nimport CallWithSignatureAbi from \"@latticexyz/world-modules/out/Unstable_CallWithSignatureSystem.sol/Unstable_CallWithSignatureSystem.abi.json\";\nimport { ConnectedClient } from \"../common\";\n\n// TODO: move this to world package or similar\n\nexport type CallWithSignatureOptions<chain extends Chain = Chain> = SignCallOptions<chain> & {\n sessionClient: ConnectedClient;\n};\n\nexport async function callWithSignature<chain extends Chain = Chain>({\n sessionClient,\n ...opts\n}: CallWithSignatureOptions<chain>) {\n const signature = await signCall(opts);\n return getAction(\n sessionClient,\n viem_writeContract,\n \"writeContract\",\n )({\n address: opts.worldAddress,\n abi: CallWithSignatureAbi,\n functionName: \"callWithSignature\",\n args: [opts.userClient.account.address, opts.systemId, opts.callData, signature],\n } as never);\n}\n","import { Address, Chain, Client, Hex, OneOf, Transport, toHex } from \"viem\";\nimport { signTypedData } from \"viem/actions\";\nimport { callWithSignatureTypes } from \"@latticexyz/world/internal\";\nimport { getRecord } from \"./getRecord\";\nimport modulesConfig from \"@latticexyz/world-modules/internal/mud.config\";\nimport { hexToResource } from \"@latticexyz/common\";\nimport { getAction } from \"viem/utils\";\nimport { ConnectedClient } from \"../common\";\n\n// TODO: move this to world package or similar\n\nexport type SignCallOptions<chain extends Chain = Chain> = {\n userClient: ConnectedClient<chain>;\n worldAddress: Address;\n systemId: Hex;\n callData: Hex;\n} & OneOf<{ nonce: bigint } | { client: Client<Transport, chain> }>;\n\nexport async function signCall<chain extends Chain = Chain>({\n userClient,\n worldAddress,\n systemId,\n callData,\n nonce: initialNonce,\n client,\n}: SignCallOptions<chain>) {\n const nonce =\n initialNonce ??\n (client\n ? (\n await getRecord(client, {\n address: worldAddress,\n table: modulesConfig.tables.CallWithSignatureNonces,\n key: { signer: userClient.account.address },\n blockTag: \"pending\",\n })\n ).nonce\n : 0n);\n\n const { namespace: systemNamespace, name: systemName } = hexToResource(systemId);\n\n return await getAction(\n userClient,\n signTypedData,\n \"signTypedData\",\n )({\n account: userClient.account,\n domain: {\n verifyingContract: worldAddress,\n salt: toHex(userClient.chain.id, { size: 32 }),\n },\n types: callWithSignatureTypes,\n primaryType: \"Call\",\n message: {\n signer: userClient.account.address,\n systemNamespace,\n systemName,\n callData,\n nonce,\n },\n });\n}\n","import { Button } from \"../ui/Button\";\nimport { useSetupSession } from \"./useSetupSession\";\nimport { ConnectedClient } from \"../common\";\nimport { useEffect } from \"react\";\nimport { useSessionClient } from \"../useSessionClient\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n};\n\nexport function Session({ isActive, isExpanded, userClient, registerSpender, registerDelegation }: Props) {\n const { data: sessionClient } = useSessionClient(userClient.account.address);\n const setup = useSetupSession({ userClient });\n const hasSession = !registerDelegation && !registerDelegation;\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (isActive && setup.status === \"idle\" && sessionClient && !hasSession) {\n setup.mutate({\n sessionClient,\n registerSpender,\n registerDelegation,\n });\n }\n });\n return () => clearTimeout(timer);\n }, [hasSession, isActive, registerDelegation, registerSpender, sessionClient, setup]);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Session</div>\n <div className=\"font-mono text-white\">{hasSession ? \"Enabled\" : \"Set up\"}</div>\n </div>\n {hasSession ? (\n <Button variant=\"tertiary\" className=\"flex-shrink-0 text-sm p-1 w-28\" autoFocus={isActive} disabled>\n Enabled\n </Button>\n ) : (\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={!sessionClient || setup.status === \"pending\"}\n onClick={\n sessionClient\n ? () =>\n setup.mutate({\n sessionClient,\n registerSpender,\n registerDelegation,\n })\n : undefined\n }\n >\n Enable\n </Button>\n )}\n </div>\n {isExpanded ? (\n <p className=\"text-sm\">You can perform actions in this app without interruptions for approvals.</p>\n ) : null}\n </div>\n );\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UseQueryResult, queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getSessionClient } from \"./getSessionClient\";\nimport { SessionClient } from \"./common\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { useSessionAccount } from \"./useSessionAccount\";\n\nexport function getSessionClientQueryOptions({\n sessionAccount,\n client,\n userAddress,\n worldAddress,\n paymasterAddress,\n}: {\n sessionAccount: SmartAccount | undefined;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n worldAddress: Address;\n paymasterAddress: Address;\n}) {\n const queryKey = [\"getSessionClient\", client?.uid, userAddress, sessionAccount?.address, worldAddress];\n return queryOptions(\n client && userAddress && sessionAccount\n ? {\n queryKey,\n queryFn: () =>\n getSessionClient({\n sessionAccount,\n client,\n userAddress,\n worldAddress,\n paymasterAddress,\n }),\n staleTime: Infinity,\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useSessionClient(userAddress: Address | undefined): UseQueryResult<SessionClient> {\n const { chainId, worldAddress, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n const { data: sessionAccount } = useSessionAccount(userAddress);\n return useQuery(\n getSessionClientQueryOptions({\n sessionAccount,\n userAddress,\n client,\n worldAddress,\n paymasterAddress,\n }),\n );\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { smartAccountActions } from \"permissionless\";\nimport { callFrom } from \"@latticexyz/world/internal\";\nimport { createBundlerClient } from \"./createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\nimport { SessionClient } from \"./common\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\n\nexport async function getSessionClient<chain extends Chain>({\n client,\n userAddress,\n sessionAccount,\n worldAddress,\n paymasterAddress,\n}: {\n client: Client<Transport, chain>;\n userAddress: Address;\n sessionAccount: SmartAccount;\n worldAddress: Address;\n paymasterAddress: Address;\n}): Promise<SessionClient<chain>> {\n const bundlerTransport = getBundlerTransport(client.chain);\n\n const sessionClient = createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account: sessionAccount,\n })\n .extend(smartAccountActions())\n .extend(callFrom({ worldAddress, delegatorAddress: userAddress, publicClient: client }))\n .extend(observer())\n .extend(() => ({ userAddress }));\n\n return sessionClient;\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 { 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 { 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/output\";\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\";\nimport { usePrerequisites } from \"./onboarding/usePrerequisites\";\nimport { useRef } from \"react\";\n\nconst containerClassNames = twMerge(\n \"w-48 p-3 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: userAddress } = useAccount();\n const initialUserAddress = useRef(userAddress);\n\n const prereqs = usePrerequisites(userAddress);\n\n // TODO: fix flash of button state signed in but incomplete onboarding\n const isConnected = status === \"connected\" || (status === \"reconnecting\" && userAddress);\n const isNewConnection = userAddress !== initialUserAddress.current;\n const isSignedIn = prereqs.isSuccess ? prereqs.data.complete : isNewConnection ? false : isConnected;\n\n const buttonLabel = (() => {\n if (prereqs.isSuccess) {\n if (!prereqs.data.hasAllowance) return \"Top up\";\n if (!prereqs.data.hasDelegation || !prereqs.data.isSpender) return \"Set up\";\n }\n return \"Sign in\";\n })();\n\n return (\n <Shadow mode=\"child\">\n {isSignedIn ? (\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)}\n onClick={openAccountModal}\n >\n <span className=\"flex-grow inline-flex gap-2.5 items-center text-left font-medium\">\n {userAddress ? <AccountName address={userAddress} /> : null}\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\",\n \"bg-orange-500 text-white font-medium\",\n \"hover:bg-orange-400\",\n \"active:bg-orange-600\",\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\">{buttonLabel}</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;\n};\n\nexport function AccountName({ address }: Props) {\n const { data: ens } = useENS(address);\n const avatar = 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={ens?.avatar && avatar.isSuccess ? 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 \"transtion duration-300\",\n avatar.isSuccess ? \"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 ens && (!ens.avatar || avatar.isError) ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n </span>\n <span className=\"flex-grow\">{ens?.name ?? <TruncatedHex hex={address} />}</span>\n </>\n );\n}\n","// Exported `useSessionClient` variant and only provides the session client once all prerequisites are met.\n\nimport { useConnectorClient } from \"wagmi\";\nimport { useSessionClient } from \"./useSessionClient\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { usePrerequisites } from \"./onboarding/usePrerequisites\";\nimport { UseQueryResult } from \"@tanstack/react-query\";\nimport { SessionClient } from \"./common\";\n\nexport function useSessionClientReady(): UseQueryResult<SessionClient | undefined> {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n if (userClient.error) console.error(\"Error retrieving user client\", userClient.error);\n\n const userAddress = userClient.data?.account.address;\n const prerequisites = usePrerequisites(userAddress);\n const sessionClient = useSessionClient(userAddress);\n\n if (!userClient.isSuccess) return { ...userClient, data: undefined } as never;\n if (!prerequisites.isSuccess || !prerequisites.data.complete) return { ...prerequisites, data: undefined } as never;\n return sessionClient;\n}\n","import { Chain, Transport } from \"viem\";\nimport { WalletList, connectorsForWallets, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { Config, CreateConfigParameters, createConfig } from \"wagmi\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\nimport { mapObject } from \"@latticexyz/common/utils\";\nimport { wiresaw } from \"./transports/wiresaw\";\n\nexport type CreateWagmiConfigOptions<\n chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport> = Record<chains[number][\"id\"], Transport>,\n> = {\n readonly chainId: number;\n readonly chains: chains;\n readonly transports: transports;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & Pick<CreateConfigParameters<chains, transports>, \"pollingInterval\">;\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n>(config: CreateWagmiConfigOptions<chains, transports>): Config<chains, transports> {\n const { wallets: defaultWallets } = getDefaultWallets();\n const wallets: WalletList = [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n }),\n ],\n },\n ...defaultWallets,\n ];\n\n const connectors = connectorsForWallets(wallets, {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n\n return createConfig({\n connectors,\n chains: config.chains,\n transports: mapObject(config.transports, (transport) => wiresaw(transport)),\n pollingInterval: config.pollingInterval,\n }) as never;\n}\n","import { Wallet } from \"@rainbow-me/rainbowkit\";\nimport { PasskeyConnectorOptions, passkeyConnector } from \"./passkeyConnector\";\n\nconst iconUrl = `data:image/svg+xml;base64,${btoa(\n // eslint-disable-next-line max-len\n '<svg xmlns=\"http://www.w3.org/2000/svg\" shape-rendering=\"geometricPrecision\" text-rendering=\"geometricPrecision\" image-rendering=\"optimizeQuality\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" width=\"512\" height=\"512\" viewBox=\"-64 -32 608 512\"><path d=\"M6.206 425.469A6.202 6.202 0 010 419.263c0-1.771.235-3.517.663-5.245 9.95-78.847 57.22-96.006 100.964-107.256 21.008-5.412 62.901-26.489 57.822-53.668-10.596-9.819-21.113-23.39-22.946-43.63l-1.274.026c-2.932-.044-5.778-.716-8.422-2.217-5.848-3.325-9.051-9.697-10.596-16.958-3.238-22.186-4.058-33.515 7.768-38.464l.096-.035c-1.467-27.37 3.159-67.64-24.944-76.141C154.622 7.1 218.597-30.203 266.627 30.805c53.519 2.801 77.389 78.611 44.154 121.046h-1.405c11.826 4.949 10.045 17.674 7.767 38.464-1.544 7.261-4.747 13.633-10.595 16.958-2.645 1.501-5.481 2.173-8.422 2.217l-1.275-.026c-1.833 20.24-12.376 33.811-22.972 43.63-4.459 23.871 27.275 43.011 49.33 50.997a139.442 139.442 0 004.268 5.525c-7.2 9.941-8.771 22.797-4.564 34.038-17.002 8.763-24.255 29.334-16.479 46.86-11.966 7.55-18.258 21.305-16.609 34.955H6.206zm419.058-105.362a86.778 86.778 0 0019.446-1.641c29.36-5.822 53.152-27.467 62.657-55.823 3.596-10.544 5.071-21.663 4.521-33.341-1.179-23.46-12.193-46.633-29.631-62.369-17.107-15.361-38.342-23.574-61.383-23.042-22.841.507-45.359 11.216-60.187 28.593-14.977 17.551-22.003 39.144-20.921 62.133.585 11.661 3.482 23.016 8.737 34.074 7.741 16.303 19.934 29.735 35.391 39.048l-22.457 20.711 13.232 27.86-29.413 13.973 13.991 29.456-26.769 12.717 16.81 35.374 35.601-16.915 40.375-110.808zm15.239-129.364c13.685 4.869 20.824 19.908 15.954 33.593-4.87 13.685-19.908 20.833-33.593 15.963-13.685-4.87-20.834-19.917-15.963-33.602 4.87-13.685 19.917-20.825 33.602-15.954z\"/></svg>',\n)}`;\n\nexport type PasskeyWalletOptions = PasskeyConnectorOptions;\n\nexport const passkeyWallet = (opts: PasskeyWalletOptions) => (): Wallet => ({\n id: \"passkey\",\n name: \"Passkey\",\n iconUrl,\n iconBackground: \"#fec\",\n createConnector: (walletDetails) => (config) => ({\n ...passkeyConnector(opts)(config),\n ...walletDetails,\n }),\n});\n","import { Account } from \"viem\";\nimport { ToCoinbaseSmartAccountReturnType } from \"./toCoinbaseSmartAccount\";\n\nexport function isCoinbaseSmartAccount(account: Account | undefined): account is ToCoinbaseSmartAccountReturnType {\n return account != null && \"__isCoinbaseSmartAccount\" in account && account.__isCoinbaseSmartAccount === true;\n}\n","import { WalletList, connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { getWallets } from \"./getWallets\";\nimport { CreateConnectorFn } from \"wagmi\";\n\nexport function getConnectors({\n wallets,\n ...config\n}: {\n readonly chainId: number;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & { readonly wallets?: WalletList }): CreateConnectorFn[] {\n return connectorsForWallets(wallets ?? getWallets(config), {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n}\n","import { WalletList, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\n\nexport function getWallets(config: { readonly chainId: number }): WalletList {\n const { wallets: defaultWallets } = getDefaultWallets();\n return [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n }),\n ],\n },\n ...defaultWallets,\n ];\n}\n"],"mappings":"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","names":["defineConfig","input","DialogRoot","DialogPortal","DialogContent","forwardRef","useEffect","useRef","useState","ReactDOM","useResizeObserver","mergeRefs","createContext","useContext","jsx","Context","FrameProvider","frame","children","useMediaQuery","createContext","useContext","RainbowKitProvider","lightTheme","midnightTheme","useChains","getPaymasterAddress","chain","paymasterAddress","jsx","Context","createContext","EntryKitConfigProvider","config","children","useContext","chain","useChains","id","paymasterAddress","getPaymasterAddress","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","event","useCallback","useMemo","useStore","createStore","store","useAccountModal","accountModalOpen","state","openAccountModal","closeAccountModal","toggleAccountModal","open","twMerge","useAccount","useConnectorClient","useAccount","twMerge","twMerge","jsx","jsxs","PendingIcon","className","props","jsx","jsxs","buttonClassName","variant","twMerge","Button","pending","type","className","children","disabled","props","PendingIcon","useConnectModal","useMutation","useConnectors","createClient","custom","getAddress","numberToHex","SwitchChainError","ChainNotConfiguredError","createConnector","createStore","persist","cache","listener","event","smartAccountActions","toWebAuthnAccount","pad","encodeFunctionData","hashMessage","hashTypedData","encodeAbiParameters","stringToHex","size","encodePacked","parseSignature","BaseError","entryPoint07Abi","entryPoint07Address","getUserOperationHash","toSmartAccount","readContract","parseP256Signature","toCoinbaseSmartAccount","parameters","client","owners","nonce","address","entryPoint","factory","factoryAbi","accountToBytes","account","owner","ownerIndex","counter","abi","calls","call","counterBits","factoryData","wrapSignature","hash","toReplaySafeHash","signature","sign","message","domain","types","primaryType","chainId","userOperation","webauthn","toWebAuthnSignature","s","signatureData","getAccount","client","id","publicKeys","cache","publicKey","owners","toWebAuthnAccount","toCoinbaseSmartAccount","bytesToHex","hashMessage","sign","bytesToHex","hexToBytes","concatBytes","utf8ToBytes","getMessageHash","webauthn","authenticatorData","challengeIndexRaw","clientDataJSON","typeIndexRaw","userVerificationRequired","typeIndex","challengeIndex","authenticatorDataBytes","flag","type","clientDataJSONHash","messageHash","sign","parseSignature","serializePublicKey","secp256r1","getCandidatePublicKeys","input","r","s","candidate1","candidate2","hashMessage","findPublicKey","input1","input2","firstDuplicate","getCandidatePublicKeys","recoverPasskeyPublicKey","input","message2","signature2","webauthn2","credential","sign","messageHash2","getMessageHash","publicKey","arr","seen","s","reusePasskey","randomChallenge","bytesToHex","messageHash","hashMessage","signature","webauthn","credential","sign","publicKey","cache","webauthnHash","getMessageHash","passkey","recoverPasskeyPublicKey","state","createCredential","createPasskey","credential","createCredential","cache","state","resourceToHex","parseAbi","worldConfig","defaultClientConfig","unlimitedDelegationControlId","worldTables","worldAbi","viem_createBundlerClient","knownChainFees","createBundlerClient","paymasterAddress","config","chain","viem_createBundlerClient","defaultClientConfig","observer","transactionQueue","createClient","fallback","http","webSocket","privateKeyToAccount","generatePrivateKey","createTransport","numberToHex","entryPoint07Address","formatUserOperationRequest","estimateUserOperationGas","_params","parseEther","formatUserOperation","toPackedUserOperation","getUserOperationHash","entryPoint07Address","entryPoint07Abi","setBalance","writeContract","getAction","sendUserOperation","executor","rpcUserOp","setBalance","parseEther","userOp","formatUserOperation","gas","packedUserOp","toPackedUserOperation","userOpHash","getUserOperationHash","entryPoint07Address","transactionHash","getAction","writeContract","entryPoint07Abi","userOpExecutor","executor","receipts","createTransport","method","params","numberToHex","entryPoint07Address","rpcUserOp","entrypoint","result","sendUserOperation","hash","estimateUserOperationGas","gasEstimator","getTransport","opts","originalRequest","rest","method","params","options","estimateUserOperationGas","http","wiresaw","getTransport","args","getWiresawTransport","transport","wiresawTransport","chainId","receipts","userOpReceipts","method","params","opts","hash","receipt","result","getBundlerTransport","chain","bundlerHttpUrl","bundlerTransport","wiresaw","gasEstimator","http","userOpExecutor","createClient","fallback","webSocket","privateKeyToAccount","generatePrivateKey","transactionQueue","passkeyConnector","chainId","createConnector","config","chain","c","configTransport","transport","wiresaw","paymasterAddress","getPaymasterAddress","bundlerTransport","getBundlerTransport","client","createClient","defaultClientConfig","connected","cache","id","createPasskey","account","getAccount","numberToHex","reusePasskey","params","accounts","SwitchChainError","ChainNotConfiguredError","a","getAddress","_connectInfo","_error","credentialId","createBundlerClient","smartAccountActions","observer","_params","custom","usePasskeyConnector","connector","useConnectors","c","passkeyConnector","twMerge","jsx","jsxs","Logo","className","props","useAppInfo","appInfo","useEntryKitConfig","appName","appOrigin","appIcon","appImage","useQuery","usePreloadImage","url","resolve","reject","image","jsx","jsxs","AppInfo","appName","appIcon","useAppInfo","hasAppIcon","appIconLoading","usePreloadImage","Logo","twMerge","jsx","jsxs","ConnectWallet","userAccount","useAccount","accountModalOpen","useAccountModal","openConnectModal","connectModalOpen","useConnectModal","passkeyConnector","usePasskeyConnector","createPasskey","useMutation","error","reusePasskey","hasPasskey","buttons","Button","AppInfo","useEffect","useMemo","useRef","useState","twMerge","parseEther","minGasBalance","useClient","queryOptions","useQuery","defineStore","parseAbi","paymasterAbi","paymasterConfig","paymasterTables","decodeValueArgs","getKeyTuple","getSchemaTypes","getValueSchema","readContract","getAction","getRecord","client","address","table","key","blockTag","staticData","encodedLengths","dynamicData","abi","getAllowance","client","paymasterAddress","userAddress","getRecord","paymasterTables","getAllowanceQueryOptions","client","paymasterAddress","userAddress","queryKey","queryOptions","getAllowance","useAllowance","chainId","useEntryKitConfig","useClient","useQuery","useClient","queryOptions","useQuery","getSpender","client","paymasterAddress","userAddress","sessionAddress","getRecord","paymasterTables","getSpenderQueryOptions","client","paymasterAddress","userAddress","sessionAddress","queryKey","queryOptions","getSpender","useClient","queryOptions","useQuery","getDelegation","client","worldAddress","userAddress","sessionAddress","getRecord","worldTables","unlimitedDelegationControlId","getDelegationQueryOptions","client","worldAddress","userAddress","sessionAddress","queryKey","queryOptions","getDelegation","queryOptions","useQuery","useQueryClient","useClient","useClient","queryOptions","useQuery","createStore","persist","store","signers","listener","event","generatePrivateKey","privateKeyToAccount","getSessionSigner","userAddress","sessionSignerPrivateKey","store","privateKey","state","getSessionAccount","client","userAddress","sessionSigner","getSessionSigner","toCoinbaseSmartAccount","getSessionAccountQueryOptions","client","userAddress","queryKey","queryOptions","getSessionAccount","useSessionAccount","chainId","useEntryKitConfig","useClient","useQuery","getPrequisitesQueryOptions","queryClient","client","userAddress","paymasterAddress","worldAddress","queryKey","queryOptions","sessionAddress","getSessionAccountQueryOptions","allowance","isSpender","hasDelegation","getAllowanceQueryOptions","getSpenderQueryOptions","getDelegationQueryOptions","hasAllowance","minGasBalance","usePrerequisites","useQueryClient","chainId","useEntryKitConfig","useClient","useQuery","useDisconnect","useQuery","useENS","address","normalizedAddress","data","res","jsx","jsxs","TruncatedHex","hex","jsx","jsxs","Wallet","isActive","isExpanded","userAddress","ens","useENS","disconnect","disconnectIsPending","useDisconnect","closeAccountModal","useAccountModal","TruncatedHex","Button","useMutation","useQueryClient","http","quarryPassIssuer","chain","url","useClaimGasPass","queryClient","useQueryClient","chain","useEntryKitConfig","mutationKey","useMutation","error","userAddress","transport","quarryPassIssuer","twMerge","jsx","jsxs","EthIcon","className","props","formatEther","formatBalance","wei","formatted","magnitude","jsx","jsxs","Balance","wei","formatBalance","EthIcon","useEffect","jsx","jsxs","Allowance","isActive","isExpanded","userAddress","allowance","useAllowance","claimGasPass","useClaimGasPass","useEffect","timer","minGasBalance","Balance","PendingIcon","Button","encodeFunctionData","useMutation","useQueryClient","getAction","sendUserOperation","waitForUserOperationReceipt","waitForTransactionReceipt","useClient","resourceToHex","IBaseWorldAbi","viem_writeContract","getAction","toHex","signTypedData","callWithSignatureTypes","modulesConfig","hexToResource","getAction","signCall","userClient","worldAddress","systemId","callData","initialNonce","client","nonce","getRecord","systemNamespace","systemName","signTypedData","toHex","callWithSignatureTypes","CallWithSignatureAbi","callWithSignature","sessionClient","opts","signature","signCall","getAction","viem_writeContract","useSetupSession","userClient","queryClient","useQueryClient","chainId","worldAddress","paymasterAddress","useEntryKitConfig","client","useClient","mutationKey","useMutation","error","sessionClient","registerSpender","registerDelegation","sessionAddress","txs","tx","callWithSignature","resourceToHex","encodeFunctionData","paymasterAbi","IBaseWorldAbi","unlimitedDelegationControlId","hash","receipt","getAction","waitForTransactionReceipt","calls","worldAbi","sendUserOperation","waitForUserOperationReceipt","useEffect","useClient","queryOptions","useQuery","smartAccountActions","callFrom","observer","getSessionClient","client","userAddress","sessionAccount","worldAddress","paymasterAddress","bundlerTransport","getBundlerTransport","createBundlerClient","smartAccountActions","callFrom","observer","getSessionClientQueryOptions","sessionAccount","client","userAddress","worldAddress","paymasterAddress","queryKey","queryOptions","getSessionClient","useSessionClient","chainId","useEntryKitConfig","useClient","useSessionAccount","useQuery","jsx","jsxs","Session","isActive","isExpanded","userClient","registerSpender","registerDelegation","sessionClient","useSessionClient","setup","useSetupSession","hasSession","useEffect","timer","Button","jsx","ConnectedSteps","userClient","initialUserAddress","userAddress","prerequisites","usePrerequisites","closeAccountModal","useAccountModal","isNewConnection","initialPrerequisites","useRef","useEffect","hasAllowance","isSpender","hasDelegation","steps","useMemo","props","Wallet","Allowance","Session","selectedStepId","useState","nextStep","step","completedSteps","activeStep","activeStepIndex","twMerge","i","isActive","isExpanded","isDisabled","useRef","jsx","AccountModalContent","chainId","useEntryKitConfig","userClient","useConnectorClient","userAddress","useAccount","initialUserAddress","ConnectWallet","ConnectedSteps","useState","ErrorBoundary","twMerge","BaseError","UserRejectedRequestError","jsx","jsxs","ErrorNotice","initialTitle","error","e","title","message","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","Logo","DialogClose","CloseIcon","jsx","jsxs","EntryKitProvider","config","children","EntryKitConfigProvider","AccountModal","useAccount","twMerge","twMerge","Fragment","jsx","jsxs","AccountName","address","ens","useENS","avatar","usePreloadImage","Logo","TruncatedHex","useRef","jsx","jsxs","containerClassNames","twMerge","secondaryClassNames","secondaryInteractiveClassNames","AccountButton","openAccountModal","accountModalOpen","useAccountModal","status","userAddress","useAccount","initialUserAddress","prereqs","usePrerequisites","isConnected","isNewConnection","isSignedIn","buttonLabel","Shadow","AccountName","Logo","PendingIcon","useConnectorClient","useSessionClientReady","chainId","useEntryKitConfig","userClient","useConnectorClient","userAddress","prerequisites","usePrerequisites","sessionClient","useSessionClient","connectorsForWallets","getDefaultWallets","createConfig","iconUrl","passkeyWallet","opts","walletDetails","config","passkeyConnector","mapObject","createWagmiConfig","config","defaultWallets","getDefaultWallets","wallets","passkeyWallet","connectors","connectorsForWallets","createConfig","mapObject","transport","wiresaw","isCoinbaseSmartAccount","account","connectorsForWallets","getDefaultWallets","getWallets","config","defaultWallets","getDefaultWallets","passkeyWallet","getConnectors","wallets","config","connectorsForWallets","getWallets"]}
1
+ {"version":3,"sources":["../../src/config/defineConfig.ts","../../src/ui/Modal.tsx","../../src/ui/Shadow.tsx","../../src/ui/FrameProvider.tsx","../../src/useTheme.ts","../../src/EntryKitConfigProvider.tsx","../../src/getPaymasterAddress.ts","../../src/useAccountModal.ts","../../src/AccountModal.tsx","../../src/AccountModalContent.tsx","../../src/ConnectWallet.tsx","../../src/ui/Button.tsx","../../src/icons/PendingIcon.tsx","../../src/usePasskeyConnector.ts","../../src/passkey/passkeyConnector.ts","../../src/passkey/cache.ts","../../src/passkey/getAccount.ts","../../src/smart-account/toCoinbaseSmartAccount.ts","../../src/passkey/reusePasskey.ts","../../src/passkey/getMessageHash.ts","../../src/passkey/recoverPasskeyPublicKey.ts","../../src/passkey/getCandidatePublicKeys.ts","../../src/passkey/createPasskey.ts","../../src/common.ts","../../src/createBundlerClient.ts","../../src/getBundlerTransport.ts","../../src/transports/userOpExecutor.ts","../../src/transports/methods/estimateUserOperationGas.ts","../../src/transports/methods/sendUserOperation.ts","../../src/transports/gasEstimator.ts","../../src/transports/wiresaw.ts","../../src/icons/Logo.tsx","../../src/useAppInfo.ts","../../src/usePreloadImage.tsx","../../src/AppInfo.tsx","../../src/onboarding/ConnectedSteps.tsx","../../src/onboarding/common.ts","../../src/onboarding/useAllowance.ts","../../src/paymaster.ts","../../src/utils/getRecord.ts","../../src/onboarding/getAllowance.ts","../../src/onboarding/useSpender.ts","../../src/onboarding/getSpender.ts","../../src/onboarding/useDelegation.ts","../../src/onboarding/getDelegation.ts","../../src/onboarding/usePrerequisites.ts","../../src/useSessionAccount.ts","../../src/store.ts","../../src/getSessionSigner.ts","../../src/getSessionAccount.ts","../../src/onboarding/Wallet.tsx","../../src/useENS.ts","../../src/ui/TruncatedHex.tsx","../../src/onboarding/useClaimGasPass.ts","../../src/transports/quarryPassIssuer.ts","../../src/icons/EthIcon.tsx","../../src/formatBalance.ts","../../src/ui/Balance.tsx","../../src/onboarding/Allowance.tsx","../../src/onboarding/useSetupSession.ts","../../src/utils/callWithSignature.ts","../../src/utils/signCall.tsx","../../src/onboarding/Session.tsx","../../src/useSessionClient.ts","../../src/getSessionClient.ts","../../src/AccountModalErrorBoundary.tsx","../../src/ErrorNotice.tsx","../../src/icons/IconSVG.tsx","../../src/icons/CloseIcon.tsx","../../src/EntryKitProvider.tsx","../../src/AccountButton.tsx","../../src/AccountName.tsx","../../src/useSessionClientReady.ts","../../src/createWagmiConfig.ts","../../src/passkey/passkeyWallet.ts","../../src/smart-account/isCoinbaseSmartAccount.ts","../../src/getConnectors.ts","../../src/getWallets.ts"],"sourcesContent":["import { EntryKitConfigInput } from \"./input\";\nimport { EntryKitConfig } from \"./output\";\n\nexport function defineConfig(input: EntryKitConfigInput): EntryKitConfig {\n return {\n ...input,\n appName: input.appName ?? document.title,\n appIcon: input.appIcon ?? document.querySelector(\"link[rel~='icon']\")?.getAttribute(\"href\") ?? \"/favico.ico\",\n };\n}\n","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 className={twMerge(\"fixed inset-0\", \"bg-neutral-800/85\", \"animate-in animate-duration-300 fade-in\")} />\n <div\n className={twMerge(\n \"fixed inset-0\",\n \"grid items-end sm:items-center\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-16\",\n )}\n >\n <div>\n <DialogContent\n className=\"outline-none w-full max-w-[26rem] mx-auto\"\n // TODO description\n aria-describedby={undefined}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n {children}\n </DialogContent>\n </div>\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-grid\" }} />;\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: \"100%\",\n height: \"100%\",\n zIndex: \"2147483646\",\n }\n : frameSize.width && frameSize.height\n ? {\n all: \"unset\",\n display: \"inline-grid\",\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: \"100%\",\n height: \"100%\",\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/output\";\nimport { Address, Chain } from \"viem\";\nimport { useChains } from \"wagmi\";\nimport { getPaymasterAddress } from \"./getPaymasterAddress\";\n\ntype ContextValue = EntryKitConfig & {\n chain: Chain;\n paymasterAddress: Address;\n};\n\n/** @internal */\nconst Context = createContext<ContextValue | 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 // TODO: move chain-based lookups to function so we can reuse here and in passkeyConnector\n\n const chains = useChains();\n const chain = chains.find(({ id }) => id === config.chainId);\n if (!chain) throw new Error(`Could not find configured chain for chain ID ${config.chainId}.`);\n\n const paymasterAddress = getPaymasterAddress(chain);\n\n return (\n <RainbowKitProvider\n appInfo={{\n appName: config.appName,\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, chain, paymasterAddress }}>{children}</Context.Provider>\n </RainbowKitProvider>\n );\n}\n\nexport function useEntryKitConfig(): ContextValue {\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 { Chain } from \"viem\";\n\nexport function getPaymasterAddress(chain: Chain) {\n const paymasterAddress =\n chain.contracts?.quarryPaymaster && \"address\" in chain.contracts.quarryPaymaster\n ? chain.contracts?.quarryPaymaster.address\n : undefined;\n if (!paymasterAddress) {\n throw new Error(`Chain ${chain.id} config did not include a \\`quarryPaymaster\\` contract address.`);\n }\n return paymasterAddress;\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\";\nimport { Logo } from \"./icons/Logo\";\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 py-2 ring-1\",\n \"bg-neutral-900 text-neutral-400 ring-neutral-700/50 divide-neutral-700\",\n \"links:font-medium links:underline links:underline-offset-4\",\n \"links:text-white\",\n \"links:decoration-neutral-500 hover:links:decoration-orange-500\",\n )}\n >\n <AccountModalErrorBoundary>\n <AccountModalContent />\n </AccountModalErrorBoundary>\n\n <a\n href=\"https://mud.dev\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"group self-center p-3 flex items-center justify-center gap-2 links-unset text-sm font-mono transition text-neutral-400 hover:text-white\"\n >\n <span className=\"block w-4 h-4\">\n <Logo className=\"w-full h-full text-orange-500 group-hover:rotate-90 transition duration-300\" />\n </span>\n <span>Powered by MUD</span>\n </a>\n\n <div className=\"absolute top-0 right-0\">\n <DialogClose\n className={twMerge(\n \"pointer-events-auto leading-none p-2 transition\",\n \"text-neutral-700 hover:text-neutral-500\",\n )}\n title=\"Close\"\n >\n <CloseIcon className=\"m-0\" />\n </DialogClose>\n </div>\n </div>\n ) : null}\n </Modal>\n );\n}\n","import { useAccount, useConnectorClient } from \"wagmi\";\nimport { ConnectWallet } from \"./ConnectWallet\";\nimport { ConnectedSteps } from \"./onboarding/ConnectedSteps\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useRef } from \"react\";\n\nexport function AccountModalContent() {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n const { address: userAddress } = useAccount();\n const initialUserAddress = useRef(userAddress);\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n console.log(\"rendering connected steps\");\n return <ConnectedSteps userClient={userClient.data} initialUserAddress={initialUserAddress.current} />;\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 { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function ConnectWallet() {\n const userAccount = useAccount();\n const { accountModalOpen } = useAccountModal();\n const { openConnectModal, connectModalOpen } = useConnectModal();\n\n // TODO: show error states\n // TODO: fix passkey issue where pending state disappears but we don't transition right away\n\n const passkeyConnector = usePasskeyConnector();\n const createPasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"createPasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.createPasskey(),\n });\n const reusePasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"reusePasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.reusePasskey(),\n });\n\n const hasPasskey = passkeyConnector.hasPasskey();\n\n const buttons = [\n <Button\n key=\"create\"\n variant={hasPasskey ? \"tertiary\" : \"secondary\"}\n className=\"self-auto flex justify-center\"\n pending={createPasskey.status === \"pending\" || createPasskey.status === \"success\"}\n onClick={() => createPasskey.mutate()}\n autoFocus={!hasPasskey}\n >\n Create account\n </Button>,\n <Button\n key=\"signin\"\n variant={hasPasskey ? \"secondary\" : \"tertiary\"}\n className=\"self-auto flex justify-center\"\n pending={reusePasskey.status === \"pending\" || reusePasskey.status === \"success\"}\n onClick={() => reusePasskey.mutate()}\n autoFocus={hasPasskey}\n >\n Sign in\n </Button>,\n ];\n\n if (hasPasskey) {\n buttons.reverse();\n }\n\n return (\n <div\n className={twMerge(\"flex flex-col gap-6 p-6\", \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\")}\n >\n <div className=\"p-4\">\n {/* TODO: render appImage if available? */}\n <AppInfo />\n </div>\n <div className=\"self-center flex flex-col gap-2 w-60\">\n {buttons}\n <button\n className=\"text-sm self-center transition text-neutral-500 hover:text-white p-2\"\n disabled={userAccount.status === \"connecting\"}\n // TODO: figure out how to prevent this from switching chains after connecting\n onClick={openConnectModal}\n >\n Already have a wallet?\n </button>\n </div>\n </div>\n );\n}\n","/* eslint-disable max-len */\nimport { 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// TODO: add error state with popover/tooltip\n\ntype ButtonClassNameOptions = {\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n pending?: boolean;\n};\n\nconst buttonClassName = ({ variant = \"secondary\" }: ButtonClassNameOptions = {}) =>\n twMerge(\n \"group/button self-center leading-none outline-none border-4 border-transparent\",\n \"transition hover:brightness-125 active:brightness-150\",\n \"focus:border-orange-500\",\n \"aria-disabled:pointer-events-none aria-busy:pointer-events-none\",\n // TODO: better disabled state\n \"aria-disabled:opacity-50\",\n \"p-[.75em] font-medium\",\n {\n primary: twMerge(\"bg-orange-600 text-white focus:border-yellow-400\"),\n secondary: twMerge(\"bg-neutral-700 text-white focus:border-orange-500\"),\n tertiary: twMerge(\"bg-neutral-800 text-white focus:border-orange-500\"),\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/button:opacity-100 group-aria-busy/button:translate-x-0 duration-100 group-aria-busy/button: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 { 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 {\n createClient,\n custom,\n EIP1193RequestFn,\n EIP1474Methods,\n getAddress,\n numberToHex,\n SwitchChainError,\n Client,\n ProviderConnectInfo,\n} from \"viem\";\nimport { ChainNotConfiguredError, createConnector, CreateConnectorFn } from \"wagmi\";\nimport { cache } from \"./cache\";\nimport { smartAccountActions } from \"permissionless/clients\";\nimport { getAccount } from \"./getAccount\";\nimport { reusePasskey } from \"./reusePasskey\";\nimport { createPasskey } from \"./createPasskey\";\nimport { defaultClientConfig } from \"../common\";\nimport { createBundlerClient } from \"../createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\nimport { getPaymasterAddress } from \"../getPaymasterAddress\";\nimport { getBundlerTransport } from \"../getBundlerTransport\";\nimport { wiresaw } from \"../transports/wiresaw\";\n\nexport type PasskeyConnectorOptions = {\n // TODO: figure out what we wanna do across chains\n chainId: number;\n};\n\nexport type PasskeyProvider = {\n request: EIP1193RequestFn<EIP1474Methods>;\n};\n\nexport type PasskeyConnectorProperties = {\n createPasskey(): Promise<void>;\n reusePasskey(): Promise<void>;\n // TODO: does wagmi storage require this to be async?\n hasPasskey(): boolean;\n getClient(parameters?: { chainId?: number | undefined } | undefined): Promise<Client>;\n onConnect(connectInfo: ProviderConnectInfo): void;\n};\n\nexport type CreatePasskeyConnector = CreateConnectorFn<PasskeyProvider, PasskeyConnectorProperties, {}>;\nexport type PasskeyConnector = ReturnType<CreatePasskeyConnector>;\n\npasskeyConnector.type = \"passkey\" as const;\n\nexport function passkeyConnector({ chainId }: PasskeyConnectorOptions): CreatePasskeyConnector {\n return createConnector((config) => {\n // TODO: figure out how to use with config's `client` option?\n if (!config.transports) {\n throw new Error(`Wagmi must be configured with transports to use the passkey connector.`);\n }\n\n const chain = config.chains.find((c) => c.id === chainId);\n if (!chain) throw new Error(`Could not find configured chain for chain ID ${chainId}.`);\n\n // TODO: wrap transports in wiresaw\n // TODO: adapt wiresaw transport to check chain config and conditionally make its own transport from wiresaw chain config and swap out methods\n\n const configTransport = config.transports[chain.id];\n if (!configTransport) {\n throw new Error(`Could not find configured transport for chain ID ${chainId}.`);\n }\n const transport = wiresaw(configTransport);\n\n const paymasterAddress = getPaymasterAddress(chain);\n const bundlerTransport = getBundlerTransport(chain);\n\n const client = createClient({ ...defaultClientConfig, chain, transport });\n\n let connected = cache.getState().activeCredential != null;\n\n return {\n id: \"passkey\",\n type: passkeyConnector.type,\n name: \"Passkey\",\n // TODO: check that this works\n // supportsSimulation: true,\n\n async createPasskey() {\n const { id } = await createPasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n async reusePasskey() {\n const { id } = await reusePasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n hasPasskey() {\n return Object.keys(cache.getState().publicKeys).length > 0;\n },\n\n async connect(params) {\n console.log(\"connect\");\n // TODO: allow any chain?\n if (params?.chainId != null && params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n // attempt to reuse credential if this is called directly\n // TODO: move this into wallet so it's only triggered via rainbowkit?\n if (!cache.getState().activeCredential && !params?.isReconnecting) {\n await reusePasskey();\n }\n\n const accounts = await this.getAccounts();\n connected = accounts.length > 0;\n\n return { accounts, chainId };\n },\n async disconnect() {\n console.log(\"disconnect\");\n connected = false;\n cache.setState({ activeCredential: null });\n },\n async getAccounts() {\n console.log(\"getAccounts\");\n const id = cache.getState().activeCredential;\n if (!id) return [];\n\n try {\n console.log(\"getting account for credential\", id);\n const account = await getAccount(client, id);\n console.log(\"got account\", account);\n return [account.address];\n } catch (error) {\n console.log(\"could not get address for credential ID\", id);\n }\n\n return [];\n },\n async getChainId() {\n return chainId;\n },\n async isAuthorized() {\n console.log(\"isAuthorized\");\n if (!connected) return false;\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n },\n async switchChain(params) {\n // TODO: allow any chain?\n if (params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n const chain = config.chains.find((c) => c.id === params.chainId);\n if (!chain) throw new SwitchChainError(new ChainNotConfiguredError());\n return chain;\n },\n onAccountsChanged(accounts) {\n console.log(\"onAccountsChanged\");\n if (accounts.length > 0) {\n config.emitter.emit(\"change\", {\n accounts: accounts.map((a) => getAddress(a)),\n });\n } else {\n this.onDisconnect();\n }\n },\n onChainChanged(chainId) {\n console.log(\"onChainChanged\");\n config.emitter.emit(\"change\", { chainId: Number(chainId) });\n },\n async onConnect(_connectInfo) {\n console.log(\"onConnect\");\n const accounts = await this.getAccounts();\n config.emitter.emit(\"connect\", { accounts, chainId });\n },\n async onDisconnect(_error) {\n console.log(\"onDisconnect\");\n config.emitter.emit(\"disconnect\");\n connected = false;\n },\n\n // By default, connector clients are bound to a `json-rpc` account.\n // We provide our own `getClient` method here so that we can return\n // a `smart` account, which is necessary for using with Viem's\n // account abstraction actions (i.e. user ops).\n //\n // Although Wagmi recommends connectors be tree-shakable, we return\n // an extended client here so that this client works with native\n // Wagmi hooks. Otherwise the app needs to build its own client, then\n // wrap each call in its own react-query hooks.\n async getClient(params) {\n console.log(\"passkeyConnector.getClient\", params);\n\n const credentialId = cache.getState().activeCredential;\n if (!credentialId) throw new Error(\"Not connected.\");\n\n const account = await getAccount(client, credentialId);\n\n return createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account,\n })\n .extend(smartAccountActions())\n .extend(observer());\n },\n\n async getProvider(_params) {\n // TODO: chain specific provider?\n // TODO: is turning off retryCount important? is wrapping in this way enough to turn off retries?\n return custom({ request: client.transport.request })({ retryCount: 0 });\n },\n };\n });\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\n// TODO: move this to wagmi storage?\n// when I tried, it blew up TS complexity and my IDE was impossible to work with\n\nexport type State = {\n readonly publicKeys: {\n readonly [key in P256Credential[\"id\"]]?: P256Credential[\"publicKey\"];\n };\n readonly activeCredential: P256Credential[\"id\"] | null;\n};\n\nexport const cache = createStore(\n persist<State>(\n () => ({\n publicKeys: {},\n activeCredential: null,\n }),\n { name: \"mud:passkey:cache\" },\n ),\n);\n\n// keep cache in sync across tabs/windows via storage event\nfunction listener(event: StorageEvent) {\n if (event.key === cache.persist.getOptions().name) {\n cache.persist.rehydrate();\n }\n}\nwindow.addEventListener(\"storage\", listener);\n","import { Client } from \"viem\";\nimport { toWebAuthnAccount } from \"viem/account-abstraction\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"webauthn-p256\";\nimport { toCoinbaseSmartAccount, ToCoinbaseSmartAccountReturnType } from \"../smart-account/toCoinbaseSmartAccount\";\n\nexport async function getAccount(client: Client, id: P256Credential[\"id\"]): Promise<ToCoinbaseSmartAccountReturnType> {\n const { publicKeys } = cache.getState();\n\n const publicKey = publicKeys[id];\n // TODO: should we prompt to recover key here?\n if (!publicKey) {\n throw new Error(\"No public key found for passkey credential.\");\n }\n\n const passkey = toWebAuthnAccount({ credential: { id, publicKey } });\n const owners = [passkey];\n\n return await toCoinbaseSmartAccount({ client, owners });\n}\n","// Forked from https://github.com/wevm/viem/blob/main/src/account-abstraction/accounts/implementations/toCoinbaseSmartAccount.ts\n// to match our forked contracts (upgrade to v0.7 entrypoint)\nimport {\n Client,\n OneOf,\n LocalAccount,\n Prettify,\n Assign,\n pad,\n encodeFunctionData,\n hashMessage,\n TypedDataDefinition,\n hashTypedData,\n Hash,\n encodeAbiParameters,\n stringToHex,\n size,\n encodePacked,\n parseSignature,\n Address,\n TypedData,\n BaseError,\n} from \"viem\";\nimport {\n WebAuthnAccount,\n SmartAccount,\n SmartAccountImplementation,\n entryPoint07Abi,\n entryPoint07Address,\n getUserOperationHash,\n UserOperation,\n toSmartAccount,\n} from \"viem/account-abstraction\";\nimport { readContract } from \"viem/actions\";\nimport { type WebAuthnData, parseSignature as parseP256Signature, Hex } from \"webauthn-p256\";\n\nexport type ToCoinbaseSmartAccountParameters = {\n address?: Address | undefined;\n client: Client;\n owners: readonly OneOf<LocalAccount | WebAuthnAccount>[];\n nonce?: bigint | undefined;\n signer?: OneOf<LocalAccount | WebAuthnAccount>;\n};\n\nexport type ToCoinbaseSmartAccountReturnType = Prettify<SmartAccount<CoinbaseSmartAccountImplementation>>;\n\nexport type CoinbaseSmartAccountImplementation = Assign<\n SmartAccountImplementation<\n typeof entryPoint07Abi,\n \"0.7\",\n {\n __isCoinbaseSmartAccount: true;\n abi: typeof abi;\n factory: { abi: typeof factoryAbi; address: Address };\n signer: OneOf<LocalAccount | WebAuthnAccount>;\n }\n >,\n {\n sign: NonNullable<SmartAccountImplementation[\"sign\"]>;\n // TODO: should this be inside `extend` of `SmartAccountImplementation`?\n isOwner: (account: LocalAccount | WebAuthnAccount) => Promise<boolean>;\n }\n>;\n\n/**\n * @description Create a Coinbase Smart Account.\n *\n * @param parameters - {@link ToCoinbaseSmartAccountParameters}\n * @returns Coinbase Smart Account. {@link ToCoinbaseSmartAccountReturnType}\n *\n * @example\n * import { toCoinbaseSmartAccount } from 'viem/account-abstraction'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { client } from './client.js'\n *\n * const account = toCoinbaseSmartAccount({\n * client,\n * owners: [privateKeyToAccount('0x...')],\n * })\n */\nexport async function toCoinbaseSmartAccount(\n parameters: ToCoinbaseSmartAccountParameters,\n): Promise<ToCoinbaseSmartAccountReturnType> {\n const { client, owners, nonce = 0n } = parameters;\n\n let address = parameters.address;\n\n const entryPoint = {\n abi: entryPoint07Abi,\n address: entryPoint07Address,\n version: \"0.7\",\n } as const;\n const factory = {\n abi: factoryAbi,\n // TODO: make configurable?\n address: \"0x356336adA1619BeC1Ae4E6D94Dd9c0490DA414a8\",\n } as const;\n\n if (!owners.length) {\n throw new Error(\"`owners` must have at least one account.\");\n }\n\n function accountToBytes(account: LocalAccount | WebAuthnAccount) {\n return account.type === \"webAuthn\" ? account.publicKey : pad(account.address);\n }\n\n const owner = parameters.signer ?? owners[0];\n const ownerIndex = owners.indexOf(owner);\n if (ownerIndex === -1) {\n throw new Error(\"`signer` must be one of `owners`.\");\n }\n\n let counter = 0n;\n\n return toSmartAccount({\n client,\n entryPoint,\n\n extend: {\n __isCoinbaseSmartAccount: true as const,\n abi,\n factory,\n signer: owner,\n },\n\n async encodeCalls(calls) {\n if (calls.length === 1)\n return encodeFunctionData({\n abi,\n functionName: \"execute\",\n args: [calls[0].to, calls[0].value ?? 0n, calls[0].data ?? \"0x\"],\n });\n return encodeFunctionData({\n abi,\n functionName: \"executeBatch\",\n args: [\n calls.map((call) => ({\n data: call.data ?? \"0x\",\n target: call.to,\n value: call.value ?? 0n,\n })),\n ],\n });\n },\n\n async getAddress() {\n address ??= await readContract(client, {\n ...factory,\n functionName: \"getAddress\",\n args: [owners.map(accountToBytes), nonce],\n });\n return address;\n },\n\n async getNonce() {\n // allows for 256 nonces per ms\n const counterBits = 8n;\n counter = (counter + 1n) % (1n << counterBits);\n\n const timestamp = BigInt(Date.now());\n const nonce = ((timestamp << counterBits) + counter) << 64n;\n\n return nonce;\n },\n\n async getFactoryArgs() {\n const factoryData = encodeFunctionData({\n abi: factory.abi,\n functionName: \"createAccount\",\n args: [owners.map(accountToBytes), nonce],\n });\n return { factory: factory.address, factoryData };\n },\n\n async getStubSignature() {\n if (owner.type === \"webAuthn\")\n // eslint-disable-next-line max-len\n return \"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000\";\n return wrapSignature({\n signature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n ownerIndex,\n });\n },\n\n async sign(parameters) {\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: parameters.hash,\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signMessage(parameters) {\n const { message } = parameters;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashMessage(message),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signTypedData(parameters) {\n const { domain, types, primaryType, message } = parameters as TypedDataDefinition<TypedData, string>;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashTypedData({\n domain,\n message,\n primaryType,\n types,\n }),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signUserOperation(parameters) {\n const { chainId = client.chain!.id, ...userOperation } = parameters;\n\n const address = await this.getAddress();\n const hash = getUserOperationHash({\n chainId,\n entryPointAddress: entryPoint.address,\n entryPointVersion: entryPoint.version,\n userOperation: {\n ...(userOperation as unknown as UserOperation),\n sender: address,\n },\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n userOperation: {\n async estimateGas(userOperation) {\n if (owner.type !== \"webAuthn\") return;\n\n // Accounts with WebAuthn owner require a minimum verification gas limit of 800,000.\n return {\n verificationGasLimit: BigInt(Math.max(Number(userOperation.verificationGasLimit ?? 0n), 800_000)),\n };\n },\n },\n\n async isOwner(account: LocalAccount | WebAuthnAccount) {\n return await readContract(client, {\n abi,\n address: await this.getAddress(),\n functionName: \"isOwnerBytes\",\n args: [accountToBytes(account)],\n });\n },\n });\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Utilities\n/////////////////////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport async function sign({ hash, owner }: { hash: Hash; owner: OneOf<LocalAccount | WebAuthnAccount> }) {\n // WebAuthn Account (Passkey)\n if (owner.type === \"webAuthn\") {\n const { signature, webauthn } = await owner.sign({\n hash,\n });\n return toWebAuthnSignature({ signature, webauthn });\n }\n\n if (owner.sign) return owner.sign({ hash });\n\n throw new BaseError(\"`owner` does not support raw sign.\");\n}\n\n/** @internal */\nexport function toReplaySafeHash({ address, chainId, hash }: { address: Address; chainId: number; hash: Hash }) {\n return hashTypedData({\n domain: {\n chainId,\n name: \"Coinbase Smart Wallet\",\n verifyingContract: address,\n version: \"1\",\n },\n types: {\n CoinbaseSmartWalletMessage: [\n {\n name: \"hash\",\n type: \"bytes32\",\n },\n ],\n },\n primaryType: \"CoinbaseSmartWalletMessage\",\n message: {\n hash,\n },\n });\n}\n\n/** @internal */\nexport function toWebAuthnSignature({ webauthn, signature }: { webauthn: WebAuthnData; signature: Hex }) {\n const { r, s } = parseP256Signature(signature);\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"authenticatorData\",\n type: \"bytes\",\n },\n { name: \"clientDataJSON\", type: \"bytes\" },\n { name: \"challengeIndex\", type: \"uint256\" },\n { name: \"typeIndex\", type: \"uint256\" },\n {\n name: \"r\",\n type: \"uint256\",\n },\n {\n name: \"s\",\n type: \"uint256\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n authenticatorData: webauthn.authenticatorData,\n clientDataJSON: stringToHex(webauthn.clientDataJSON),\n challengeIndex: BigInt(webauthn.challengeIndex),\n typeIndex: BigInt(webauthn.typeIndex),\n r,\n s,\n },\n ],\n );\n}\n\n/** @internal */\nexport function wrapSignature(parameters: { ownerIndex: number; signature: Hex }) {\n const { ownerIndex } = parameters;\n const signatureData = (() => {\n if (size(parameters.signature) !== 65) return parameters.signature;\n const signature = parseSignature(parameters.signature);\n return encodePacked([\"bytes32\", \"bytes32\", \"uint8\"], [signature.r, signature.s, signature.yParity === 0 ? 27 : 28]);\n })();\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"ownerIndex\",\n type: \"uint8\",\n },\n {\n name: \"signatureData\",\n type: \"bytes\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n ownerIndex,\n signatureData,\n },\n ],\n );\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Constants\n/////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const abi = [\n { inputs: [], stateMutability: \"nonpayable\", type: \"constructor\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"AlreadyOwner\",\n type: \"error\",\n },\n { inputs: [], name: \"Initialized\", type: \"error\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidEthereumAddressOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"key\", type: \"uint256\" }],\n name: \"InvalidNonceKey\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidOwnerBytesLength\",\n type: \"error\",\n },\n { inputs: [], name: \"LastOwner\", type: \"error\" },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"NoOwnerAtIndex\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"ownersRemaining\", type: \"uint256\" }],\n name: \"NotLastOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"selector\", type: \"bytes4\" }],\n name: \"SelectorNotAllowed\",\n type: \"error\",\n },\n { inputs: [], name: \"Unauthorized\", type: \"error\" },\n { inputs: [], name: \"UnauthorizedCallContext\", type: \"error\" },\n { inputs: [], name: \"UpgradeFailed\", type: \"error\" },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"expectedOwner\", type: \"bytes\" },\n { name: \"actualOwner\", type: \"bytes\" },\n ],\n name: \"WrongOwnerAtIndex\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"AddOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"RemoveOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"implementation\",\n type: \"address\",\n },\n ],\n name: \"Upgraded\",\n type: \"event\",\n },\n { stateMutability: \"payable\", type: \"fallback\" },\n {\n inputs: [],\n name: \"REPLAYABLE_NONCE_KEY\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owner\", type: \"address\" }],\n name: \"addOwnerAddress\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"addOwnerPublicKey\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"functionSelector\", type: \"bytes4\" }],\n name: \"canSkipChainIdValidation\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"domainSeparator\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"eip712Domain\",\n outputs: [\n { name: \"fields\", type: \"bytes1\" },\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"extensions\", type: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"entryPoint\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"execute\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"executeBatch\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"calls\", type: \"bytes[]\" }],\n name: \"executeWithoutChainIdValidation\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n ],\n name: \"getUserOpHashWithoutChainId\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"$\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owners\", type: \"bytes[]\" }],\n name: \"initialize\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"isOwnerAddress\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"bytes\" }],\n name: \"isOwnerBytes\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"isOwnerPublicKey\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"hash\", type: \"bytes32\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"isValidSignature\",\n outputs: [{ name: \"result\", type: \"bytes4\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextOwnerIndex\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"ownerAtIndex\",\n outputs: [{ name: \"\", type: \"bytes\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ownerCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"proxiableUUID\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeLastOwner\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeOwnerAtIndex\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"removedOwnersCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"hash\", type: \"bytes32\" }],\n name: \"replaySafeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"newImplementation\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"upgradeToAndCall\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n { name: \"userOpHash\", type: \"bytes32\" },\n { name: \"missingAccountFunds\", type: \"uint256\" },\n ],\n name: \"validateUserOp\",\n outputs: [{ name: \"validationData\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n { stateMutability: \"payable\", type: \"receive\" },\n] as const;\n\nconst factoryAbi = [\n {\n inputs: [{ name: \"implementation_\", type: \"address\" }],\n stateMutability: \"payable\",\n type: \"constructor\",\n },\n { inputs: [], name: \"OwnerRequired\", type: \"error\" },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"createAccount\",\n outputs: [\n {\n name: \"account\",\n type: \"address\",\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"getAddress\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"initCodeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { bytesToHex, hashMessage } from \"viem\";\nimport { sign } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { recoverPasskeyPublicKey } from \"./recoverPasskeyPublicKey\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function reusePasskey(): Promise<P256Credential> {\n const randomChallenge = bytesToHex(crypto.getRandomValues(new Uint8Array(256)));\n const messageHash = hashMessage(randomChallenge);\n const { signature, webauthn, raw: credential } = await sign({ hash: messageHash });\n\n const publicKey = await (async () => {\n const publicKey = cache.getState().publicKeys[credential.id];\n if (publicKey) return publicKey;\n\n // TODO: look up account/public key by credential ID once we store it onchain\n\n const webauthnHash = await getMessageHash(webauthn);\n const passkey = await recoverPasskeyPublicKey({\n credentialId: credential.id,\n messageHash: webauthnHash,\n signatureHex: signature,\n });\n if (!passkey) {\n throw new Error(\"recovery failed\");\n }\n if (passkey.credential.id !== credential.id) {\n throw new Error(\"wrong credential\");\n }\n\n cache.setState((state) => ({\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: passkey.publicKey,\n },\n }));\n\n return passkey.publicKey;\n })();\n\n console.log(\"recovered passkey\", credential.id, publicKey);\n\n cache.setState(() => ({\n activeCredential: credential.id,\n }));\n\n return { id: credential.id, publicKey, raw: credential };\n}\n","import { bytesToHex, Hex, hexToBytes, WebAuthnData } from \"webauthn-p256\";\nimport { concatBytes, utf8ToBytes } from \"@noble/curves/abstract/utils\";\n\n// lifted out of https://github.com/wevm/webauthn-p256/blob/main/src/verify.ts\n// TODO: submit a PR to lift this out as a function that can be exported\n\nexport async function getMessageHash(\n webauthn: Omit<WebAuthnData, \"typeIndex\" | \"challengeIndex\"> & {\n challengeIndex?: number;\n typeIndex?: number;\n },\n): Promise<Hex | never> {\n const {\n authenticatorData,\n challengeIndex: challengeIndexRaw,\n clientDataJSON,\n typeIndex: typeIndexRaw,\n userVerificationRequired,\n } = webauthn;\n\n const typeIndex = typeIndexRaw || clientDataJSON.indexOf('\"type\"');\n const challengeIndex = challengeIndexRaw || clientDataJSON.indexOf('\"challenge\"');\n\n const authenticatorDataBytes = hexToBytes(authenticatorData);\n\n // Check length of `authenticatorData`.\n if (authenticatorDataBytes.length < 37) throw new Error(\"Invalid authenticatorData\");\n\n const flag = authenticatorDataBytes[32]!;\n\n // Verify that the UP bit of the flags in authData is set.\n if ((flag & 0x01) !== 0x01) throw new Error(\"Invalid authenticatorData\");\n\n // If user verification was determined to be required, verify that\n // the UV bit of the flags in authData is set. Otherwise, ignore the\n // value of the UV flag.\n if (userVerificationRequired && (flag & 0x04) !== 0x04) throw new Error(\"Invalid authenticatorData\");\n\n // If the BE bit of the flags in authData is not set, verify that\n // the BS bit is not set.\n if ((flag & 0x08) !== 0x08 && (flag & 0x10) === 0x10) throw new Error(\"Invalid authenticatorData\");\n\n // Check that response is for an authentication assertion\n const type = '\"type\":\"webauthn.get\"';\n if (type !== clientDataJSON.slice(Number(typeIndex), type.length + 1)) throw new Error(\"Invalid clientDataJSON\");\n\n // Check that hash is in the clientDataJSON.\n const match = clientDataJSON.slice(Number(challengeIndex)).match(/^\"challenge\":\"(.*?)\"/);\n if (!match) throw new Error(\"Invalid clientDataJSON\");\n\n const clientDataJSONHash = new Uint8Array(await crypto.subtle.digest(\"SHA-256\", utf8ToBytes(clientDataJSON)));\n const messageHash = new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", concatBytes(hexToBytes(authenticatorData), clientDataJSONHash)),\n );\n\n return bytesToHex(messageHash);\n}\n","import { sign } from \"webauthn-p256\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { getCandidatePublicKeys } from \"./getCandidatePublicKeys\";\nimport { SignatureAndMessage } from \"./common\";\nimport { hashMessage, Hex } from \"viem\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport function findPublicKey([input1, input2]: [SignatureAndMessage, SignatureAndMessage]): Hex | undefined {\n // Return the candidate public key that appears twice\n return firstDuplicate([...getCandidatePublicKeys(input1), ...getCandidatePublicKeys(input2)]);\n}\n\nexport async function recoverPasskeyPublicKey(input: { credentialId: P256Credential[\"id\"] } & SignatureAndMessage) {\n const message2 = hashMessage(input.signatureHex);\n const {\n signature: signature2,\n webauthn: webauthn2,\n raw: credential,\n } = await sign({ credentialId: input.credentialId, hash: message2 });\n const messageHash2 = await getMessageHash(webauthn2);\n\n const publicKey = findPublicKey([input, { signatureHex: signature2, messageHash: messageHash2 }]);\n if (publicKey) {\n return { publicKey, credential };\n }\n}\n\nfunction firstDuplicate<T>(arr: T[]): T | undefined {\n const seen = new Set<T>();\n for (const s of arr) {\n if (seen.has(s)) {\n return s;\n }\n seen.add(s);\n }\n return undefined;\n}\n","import { parseSignature, serializePublicKey } from \"webauthn-p256\";\nimport { SignatureAndMessage } from \"./common\";\nimport { secp256r1 } from \"@noble/curves/p256\";\n\nexport function getCandidatePublicKeys(input: SignatureAndMessage) {\n const { r, s } = parseSignature(input.signatureHex);\n\n const candidate1 = new secp256r1.Signature(r, s).addRecoveryBit(1).recoverPublicKey(input.messageHash.slice(2));\n const candidate2 = new secp256r1.Signature(r, s).addRecoveryBit(0).recoverPublicKey(input.messageHash.slice(2));\n\n return [serializePublicKey(candidate1), serializePublicKey(candidate2)];\n}\n","import { createCredential } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function createPasskey(): Promise<P256Credential> {\n const credential = await createCredential({ name: \"MUD Account\" });\n console.log(\"created passkey\", credential);\n\n cache.setState((state) => ({\n activeCredential: credential.id,\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: credential.publicKey,\n },\n }));\n\n return credential;\n}\n","import { resourceToHex } from \"@latticexyz/common\";\nimport { Client, Chain, Transport, Account, parseAbi, ClientConfig, Address } from \"viem\";\nimport worldConfig from \"@latticexyz/world/mud.config\";\n\nexport type ConnectedClient<chain extends Chain = Chain> = Client<Transport, chain, Account>;\nexport type SessionClient<chain extends Chain = Chain> = ConnectedClient<chain> & { readonly userAddress: Address };\n\nexport const defaultClientConfig = {\n pollingInterval: 250,\n} as const satisfies Pick<ClientConfig, \"pollingInterval\">;\n\nexport const unlimitedDelegationControlId = resourceToHex({ type: \"system\", namespace: \"\", name: \"unlimited\" });\n\nexport const worldTables = worldConfig.namespaces.world.tables;\n\nexport const worldAbi = parseAbi([\n \"function registerDelegation(address delegatee, bytes32 delegationControlId, bytes initCallData)\",\n]);\n","import { Transport, Chain, Client, RpcSchema, Address } from \"viem\";\nimport {\n BundlerClient,\n BundlerClientConfig,\n SmartAccount,\n createBundlerClient as viem_createBundlerClient,\n} from \"viem/account-abstraction\";\nimport { defaultClientConfig } from \"./common\";\n\nconst knownChainFees = new Set([\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 31337,\n // rhodolite\n 17420,\n // garnet\n 17069,\n // redstone\n 690,\n]);\n\nexport function createBundlerClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n account extends SmartAccount | undefined = undefined,\n client extends Client | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>({\n paymasterAddress,\n ...config\n}: BundlerClientConfig<transport, chain, account, client, rpcSchema> & { paymasterAddress: Address }): BundlerClient<\n transport,\n chain,\n account,\n client,\n rpcSchema\n> {\n const chain = config.chain ?? config.client?.chain;\n return viem_createBundlerClient({\n ...defaultClientConfig,\n paymaster: {\n getPaymasterData: async () => ({\n // TODO: source this from the chain config instead\n paymaster: paymasterAddress,\n paymasterData: \"0x\",\n }),\n },\n userOperation: {\n estimateFeesPerGas:\n // TODO: source this from the chain config instead\n chain && knownChainFees.has(chain.id)\n ? async () => ({\n maxFeePerGas: 100_000n,\n maxPriorityFeePerGas: 0n,\n })\n : undefined,\n },\n ...config,\n });\n}\n","import { transactionQueue } from \"@latticexyz/common/actions\";\nimport { Chain, createClient, fallback, http, webSocket } from \"viem\";\nimport { privateKeyToAccount, generatePrivateKey } from \"viem/accounts\";\nimport { userOpExecutor } from \"./transports/userOpExecutor\";\nimport { gasEstimator } from \"./transports/gasEstimator\";\nimport { wiresaw } from \"./transports/wiresaw\";\n\nexport function getBundlerTransport(chain: Chain) {\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n const bundlerTransport = chain.rpcUrls.bundler?.http[0]\n ? wiresaw(gasEstimator(http(bundlerHttpUrl)))\n : chain.id === 31337\n ? userOpExecutor({\n executor: createClient({\n chain,\n transport: fallback([webSocket(), http()]),\n account: privateKeyToAccount(generatePrivateKey()),\n }).extend(transactionQueue()),\n })\n : null;\n if (!bundlerTransport) {\n throw new Error(`Chain ${chain.id} config did not include a bundler RPC URL.`);\n }\n return bundlerTransport;\n}\n","import {\n BundlerRpcSchema,\n EIP1193RequestFn,\n Hash,\n RpcUserOperationReceipt,\n Transport,\n createTransport,\n numberToHex,\n} from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\nimport { TransportRequestFn } from \"./common\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { sendUserOperation } from \"./methods/sendUserOperation\";\nimport { ConnectedClient } from \"../common\";\n\nexport function userOpExecutor({ executor }: { executor: ConnectedClient }): Transport {\n return () => {\n const receipts = new Map<Hash, RpcUserOperationReceipt<\"0.7\">>();\n\n const request: TransportRequestFn<BundlerRpcSchema> = async ({ method, params }) => {\n // TODO: move chain/ID into args and executors as accounts instead of clients?\n if (method === \"eth_chainId\") {\n return numberToHex(executor.chain.id);\n }\n\n if (method === \"eth_supportedEntryPoints\") {\n return [entryPoint07Address];\n }\n\n if (method === \"eth_sendUserOperation\") {\n const [rpcUserOp, entrypoint] = params;\n if (entrypoint === entryPoint07Address) {\n const result = await sendUserOperation({ executor, rpcUserOp });\n receipts.set(result.userOpHash, result as RpcUserOperationReceipt<\"0.7\">);\n return result.userOpHash;\n }\n }\n\n if (method === \"eth_getUserOperationReceipt\") {\n const [hash] = params;\n return receipts.get(hash) ?? null;\n }\n\n if (method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas(params);\n }\n\n throw new Error(\"Not implemented\");\n };\n\n return createTransport({\n key: \"userOpExecutor\",\n type: \"userOpExecutor\",\n name: \"User Operation Executor Transport\",\n request: request as EIP1193RequestFn,\n });\n };\n}\n","import { BundlerRpcSchema } from \"viem\";\nimport { formatUserOperationRequest } from \"viem/account-abstraction\";\nimport { RpcMethod } from \"../common\";\n\ntype rpcMethod = RpcMethod<BundlerRpcSchema, \"eth_estimateUserOperationGas\">;\n\nexport async function estimateUserOperationGas(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _params: rpcMethod[\"Parameters\"],\n): Promise<rpcMethod[\"ReturnType\"]> {\n return formatUserOperationRequest({\n callGasLimit: 1_000_000n,\n preVerificationGas: 100_000n,\n verificationGasLimit: 1_000_000n,\n paymasterVerificationGasLimit: 100_000n,\n paymasterPostOpGasLimit: 100_000n,\n });\n}\n","import { Client, Transport, Chain, Account, RpcUserOperation, RpcUserOperationReceipt, parseEther } from \"viem\";\nimport {\n formatUserOperation,\n toPackedUserOperation,\n getUserOperationHash,\n entryPoint07Address,\n entryPoint07Abi,\n} from \"viem/account-abstraction\";\nimport { setBalance, writeContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\n// TODO: move this into a generic to support other versions?\nconst entryPointVersion = \"0.7\";\ntype entryPointVersion = typeof entryPointVersion;\n\nexport async function sendUserOperation({\n executor,\n rpcUserOp,\n}: {\n executor: Client<Transport, Chain, Account>;\n rpcUserOp: RpcUserOperation<entryPointVersion>;\n}): Promise<\n Pick<RpcUserOperationReceipt<entryPointVersion>, \"success\" | \"userOpHash\"> & {\n receipt: Pick<RpcUserOperationReceipt<entryPointVersion>[\"receipt\"], \"transactionHash\">;\n }\n> {\n if (executor.chain.id === 31337) {\n await setBalance(\n executor.extend(() => ({ mode: \"anvil\" })),\n {\n address: executor.account.address,\n value: parseEther(\"100\"),\n },\n );\n }\n\n const userOp = formatUserOperation(rpcUserOp);\n const gas =\n userOp.preVerificationGas +\n userOp.verificationGasLimit +\n (userOp.paymasterVerificationGasLimit ?? 0n) +\n (userOp.paymasterPostOpGasLimit ?? 0n) +\n userOp.callGasLimit;\n\n const packedUserOp = toPackedUserOperation(userOp);\n\n const userOpHash = getUserOperationHash({\n userOperation: userOp,\n chainId: executor.chain.id,\n entryPointVersion: \"0.7\",\n entryPointAddress: entryPoint07Address,\n });\n\n const transactionHash = await getAction(\n executor,\n writeContract,\n \"writeContract\",\n )({\n abi: entryPoint07Abi,\n address: entryPoint07Address,\n functionName: \"handleOps\",\n args: [[packedUserOp], executor.account.address],\n chain: executor.chain,\n account: executor.account,\n gas,\n });\n\n return {\n success: true,\n userOpHash,\n receipt: { transactionHash },\n };\n}\n","import { BundlerRpcSchema, Transport } from \"viem\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { TransportRequestFn, getRpcSchema } from \"./common\";\n\nexport function gasEstimator<const transport extends Transport>(getTransport: transport): transport {\n return ((opts) => {\n const { request: originalRequest, ...rest } = getTransport(opts);\n\n const request: TransportRequestFn<getRpcSchema<BundlerRpcSchema, \"eth_estimateUserOperationGas\">> = async (\n { method, params },\n options,\n ) => {\n if (method === \"eth_estimateUserOperationGas\") {\n return estimateUserOperationGas(params);\n }\n return originalRequest({ method, params }, options);\n };\n\n return { request, ...rest };\n }) as transport;\n}\n","import {\n BundlerRpcSchema,\n Hash,\n Hex,\n PublicRpcSchema,\n RpcTransactionReceipt,\n RpcUserOperationReceipt,\n Transport,\n http,\n} from \"viem\";\nimport { getRpcMethod, getRpcSchema, TransportRequestFn, TransportRequestFnMapped } from \"./common\";\n\nexport type WiresawRpcSchema = [\n {\n Method: \"wiresaw_call\";\n Parameters: getRpcMethod<PublicRpcSchema, \"eth_call\">[\"Parameters\"];\n ReturnType: getRpcMethod<PublicRpcSchema, \"eth_call\">[\"ReturnType\"];\n },\n {\n Method: \"wiresaw_sendUserOperation\";\n Parameters: getRpcMethod<BundlerRpcSchema, \"eth_sendUserOperation\">[\"Parameters\"];\n ReturnType: {\n userOpHash: Hex;\n txHash: Hex;\n };\n },\n];\n\nexport type OverriddenMethods = [\n ...getRpcSchema<PublicRpcSchema, \"eth_chainId\" | \"eth_call\" | \"eth_getTransactionReceipt\">,\n ...getRpcSchema<BundlerRpcSchema, \"eth_sendUserOperation\" | \"eth_getUserOperationReceipt\">,\n];\n\nexport function wiresaw<const transport extends Transport>(getTransport: transport): transport {\n return ((args) => {\n const getWiresawTransport =\n args.chain?.rpcUrls && \"wiresaw\" in args.chain.rpcUrls ? http(args.chain.rpcUrls.wiresaw.http[0]) : undefined;\n if (!getWiresawTransport) return getTransport(args);\n\n const transport = getTransport(args) as { request: TransportRequestFn<OverriddenMethods> };\n const wiresawTransport = getWiresawTransport(args) as { request: TransportRequestFn<WiresawRpcSchema> };\n\n let chainId: Hex | null = null;\n const receipts = new Map<Hash, RpcTransactionReceipt>();\n const userOpReceipts = new Map<Hash, RpcUserOperationReceipt>();\n\n const request: TransportRequestFnMapped<OverriddenMethods> = async ({ method, params }, opts) => {\n if (method === \"eth_chainId\") {\n if (chainId != null) return chainId;\n return (chainId = await transport.request({ method, params }, opts));\n }\n\n // TODO: only route to wiresaw if using pending block tag\n if (method === \"eth_call\") {\n return wiresawTransport.request({ method: \"wiresaw_call\", params });\n }\n\n if (method === \"eth_getTransactionReceipt\") {\n const [hash] = params;\n const receipt = receipts.get(hash) ?? (await transport.request({ method, params }));\n if (!receipts.has(hash) && receipt) receipts.set(hash, receipt);\n return receipt;\n }\n\n if (method === \"eth_sendUserOperation\") {\n const result = await wiresawTransport.request({\n method: \"wiresaw_sendUserOperation\",\n params,\n });\n // :haroldsmile:\n userOpReceipts.set(result.userOpHash, {\n success: true,\n userOpHash: result.userOpHash,\n receipt: { transactionHash: result.txHash },\n } as RpcUserOperationReceipt);\n return result.userOpHash;\n }\n\n if (method === \"eth_getUserOperationReceipt\") {\n const [hash] = params;\n const receipt = userOpReceipts.get(hash) ?? (await transport.request({ method, params }));\n if (!userOpReceipts.has(hash) && receipt) userOpReceipts.set(hash, receipt);\n return receipt;\n }\n\n return await transport.request({ method, params }, opts);\n };\n\n return { ...transport, request };\n }) as transport;\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: [\"preloadImage\", 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, 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=\"text-2xl text-white text-center\">{appName}</div>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { twMerge } from \"tailwind-merge\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Wallet } from \"./Wallet\";\nimport { Allowance } from \"./Allowance\";\nimport { Session } from \"./Session\";\nimport { Step } from \"./common\";\nimport { Address } from \"viem\";\nimport { useAccountModal } from \"../useAccountModal\";\n\nexport type Props = {\n userClient: ConnectedClient;\n initialUserAddress: Address | undefined;\n};\n\nexport function ConnectedSteps({ userClient, initialUserAddress }: Props) {\n const userAddress = userClient.account.address;\n const { data: prerequisites } = usePrerequisites(userAddress);\n\n const { closeAccountModal } = useAccountModal();\n const isNewConnection = userAddress !== initialUserAddress;\n\n const initialPrerequisites = useRef(prerequisites);\n useEffect(() => {\n if (prerequisites == null) return;\n if (initialPrerequisites.current == null) {\n initialPrerequisites.current = prerequisites;\n }\n\n if (prerequisites.complete) {\n if (isNewConnection || !initialPrerequisites.current.complete) {\n closeAccountModal();\n }\n }\n }, [closeAccountModal, isNewConnection, prerequisites]);\n\n const { hasAllowance, isSpender, hasDelegation } = prerequisites ?? {};\n\n const steps = useMemo((): readonly Step[] => {\n if (!userAddress) {\n return [\n {\n id: \"wallet\",\n isComplete: false,\n content: () => null,\n },\n ];\n }\n\n return [\n {\n id: \"wallet\",\n isComplete: true,\n content: (props) => <Wallet {...props} userAddress={userAddress} />,\n },\n {\n id: \"allowance\",\n isComplete: !!hasAllowance,\n content: (props) => <Allowance {...props} userAddress={userAddress} />,\n },\n {\n id: \"session\",\n isComplete: !!isSpender && !!hasDelegation,\n content: (props) => (\n <Session\n {...props}\n userClient={userClient}\n registerSpender={!isSpender}\n registerDelegation={!hasDelegation}\n />\n ),\n },\n ];\n }, [hasAllowance, hasDelegation, isSpender, userAddress, userClient]);\n\n const [selectedStepId] = 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 const activeStepIndex = activeStep ? steps.indexOf(activeStep) : -1;\n\n return (\n <div\n className={twMerge(\n \"min-h-[26rem] px-8 flex flex-col divide-y divide-neutral-800\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\",\n )}\n >\n {steps.map((step, i) => {\n const isActive = step === activeStep;\n const isExpanded = isActive || completedSteps.length === steps.length;\n const isDisabled = !step.isComplete && activeStepIndex !== -1 && i > activeStepIndex;\n return (\n <div key={step.id} className={twMerge(\"py-8 flex flex-col justify-center\", isActive ? \"flex-grow\" : null)}>\n <div className={twMerge(\"flex flex-col\", isDisabled ? \"opacity-30 pointer-events-none\" : null)}>\n {step.content({ isActive, isExpanded })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { parseEther } from \"viem\";\n\nexport type Step = {\n id: string;\n isComplete: boolean;\n content: (props: { isActive: boolean; isExpanded: boolean }) => ReactNode;\n};\n\nexport const minGasBalance = parseEther(\"0.01\");\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getAllowance } from \"./getAllowance\";\n\nexport function getAllowanceQueryOptions({\n client,\n paymasterAddress,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n paymasterAddress: Address;\n userAddress: Address | undefined;\n}) {\n const queryKey = [\"getAllowance\", client?.chain.id, paymasterAddress, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getAllowance({ client, paymasterAddress, userAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useAllowance(userAddress: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getAllowanceQueryOptions({ client, paymasterAddress, userAddress }));\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: whole ABI\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 { Address, Client, Hex } from \"viem\";\nimport { Table } from \"@latticexyz/config\";\nimport {\n decodeValueArgs,\n getKeySchema,\n getKeyTuple,\n getSchemaPrimitives,\n getSchemaTypes,\n getValueSchema,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { readContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\n// TODO: move this to store package or similar\n\nexport type GetRecordOptions<table extends Table> = {\n address: Address;\n table: table;\n key: getSchemaPrimitives<getKeySchema<table>>;\n blockTag?: \"latest\" | \"pending\";\n};\n\nexport async function getRecord<table extends Table>(\n client: Client,\n { address, table, key, blockTag }: GetRecordOptions<table>,\n): Promise<getSchemaPrimitives<table[\"schema\"]>> {\n const [staticData, encodedLengths, dynamicData] = await getAction(\n client,\n readContract,\n \"readContract\",\n )({\n address,\n abi,\n functionName: \"getRecord\",\n args: [table.tableId, getKeyTuple(table, key) as readonly Hex[]],\n blockTag,\n });\n\n return {\n ...key,\n ...decodeValueArgs(getSchemaTypes(getValueSchema(table)), { staticData, encodedLengths, dynamicData }),\n };\n}\n\nconst abi = [\n {\n type: \"function\",\n name: \"getRecord\",\n inputs: [\n {\n name: \"tableId\",\n type: \"bytes32\",\n internalType: \"ResourceId\",\n },\n {\n name: \"keyTuple\",\n type: \"bytes32[]\",\n internalType: \"bytes32[]\",\n },\n ],\n outputs: [\n {\n name: \"staticData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"encodedLengths\",\n type: \"bytes32\",\n internalType: \"EncodedLengths\",\n },\n {\n name: \"dynamicData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"../paymaster\";\nimport { getRecord } from \"../utils/getRecord\";\n\nexport type GetAllowanceParams = {\n client: Client<Transport, Chain>;\n paymasterAddress: Address;\n userAddress: Address;\n};\n\nexport async function getAllowance({ client, paymasterAddress, userAddress }: GetAllowanceParams) {\n const record = await getRecord(client, {\n address: paymasterAddress,\n table: paymasterTables.Allowance,\n key: { user: userAddress },\n blockTag: \"pending\",\n });\n return record.allowance;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getSpender } from \"./getSpender\";\n\nexport function getSpenderQueryOptions({\n client,\n paymasterAddress,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n paymasterAddress: Address;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n const queryKey = [\"getSpender\", client?.chain.id, paymasterAddress, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getSpender({ client, paymasterAddress, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useSpender(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSpenderQueryOptions({ client, paymasterAddress, userAddress, sessionAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"../paymaster\";\nimport { getRecord } from \"../utils/getRecord\";\n\nexport type GetSpenderParams = {\n client: Client<Transport, Chain>;\n paymasterAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n};\n\nexport async function getSpender({ client, paymasterAddress, userAddress, sessionAddress }: GetSpenderParams) {\n const record = await getRecord(client, {\n address: paymasterAddress,\n table: paymasterTables.Spender,\n key: { spender: sessionAddress },\n blockTag: \"pending\",\n });\n return record.user.toLowerCase() === userAddress.toLowerCase();\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getDelegation } from \"./getDelegation\";\n\nexport function getDelegationQueryOptions({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n worldAddress: Address;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n const queryKey = [\"getDelegation\", client?.chain.id, worldAddress, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getDelegation({ client, worldAddress, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useDelegation(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { getRecord } from \"../utils/getRecord\";\nimport { unlimitedDelegationControlId, worldTables } from \"../common\";\n\nexport type GetDelegationParams = {\n client: Client<Transport, Chain>;\n worldAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n};\n\nexport async function getDelegation({ client, worldAddress, userAddress, sessionAddress }: GetDelegationParams) {\n const record = await getRecord(client, {\n address: worldAddress,\n table: worldTables.UserDelegationControl,\n key: { delegator: userAddress, delegatee: sessionAddress },\n blockTag: \"pending\",\n });\n return record.delegationControlId === unlimitedDelegationControlId;\n}\n","import { minGasBalance } from \"./common\";\nimport { getAllowanceQueryOptions } from \"./useAllowance\";\nimport { getSpenderQueryOptions } from \"./useSpender\";\nimport { getDelegationQueryOptions } from \"./useDelegation\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { Address, Chain, Client, Transport } from \"viem\";\nimport { getSessionAccountQueryOptions } from \"../useSessionAccount\";\n\nexport function getPrequisitesQueryOptions({\n queryClient,\n client,\n userAddress,\n paymasterAddress,\n worldAddress,\n}: {\n queryClient: QueryClient;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n paymasterAddress: Address;\n worldAddress: Address;\n}) {\n const queryKey = [\"getPrerequisites\", client?.chain.id, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: async () => {\n const { address: sessionAddress } = await queryClient.fetchQuery(\n getSessionAccountQueryOptions({ client, userAddress }),\n );\n const [allowance, isSpender, hasDelegation] = await Promise.all([\n queryClient.fetchQuery(getAllowanceQueryOptions({ client, paymasterAddress, userAddress })),\n queryClient.fetchQuery(getSpenderQueryOptions({ client, paymasterAddress, userAddress, sessionAddress })),\n queryClient.fetchQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress })),\n ]);\n const hasAllowance = allowance >= minGasBalance;\n return {\n hasAllowance,\n isSpender,\n hasDelegation,\n complete: hasAllowance && isSpender && hasDelegation,\n };\n },\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function usePrerequisites(userAddress: Address | undefined) {\n const queryClient = useQueryClient();\n const { chainId, paymasterAddress, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n // TODO: rework this so it uses other hooks so we avoid having to clear two caches when e.g. topping up\n\n const prereqs = useQuery(\n getPrequisitesQueryOptions({\n queryClient,\n client,\n userAddress,\n paymasterAddress,\n worldAddress,\n }),\n queryClient,\n );\n // console.log(\"prereqs\", prereqs.isFetching, prereqs.isRefetching, prereqs.isFetchedAfterMount);\n return prereqs;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UseQueryResult, queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getSessionAccount } from \"./getSessionAccount\";\nimport { SmartAccount } from \"viem/account-abstraction\";\n\nexport function getSessionAccountQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n const queryKey = [\"getSessionAccount\", client?.chain.id, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getSessionAccount({ client, userAddress }),\n staleTime: Infinity,\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useSessionAccount(userAddress: Address | undefined): UseQueryResult<SmartAccount> {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSessionAccountQueryOptions({ userAddress, client }));\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { Address, Hex } from \"viem\";\n\nexport type State = {\n readonly signers: {\n readonly [key in Address]?: Hex;\n };\n};\n\nexport const store = createStore(\n persist<State>(\n () => ({\n signers: {},\n }),\n {\n name: \"mud:entrykit\",\n partialize: ({ signers }) => ({ signers }),\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 \"./store\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport function getSessionSigner(userAddress: Address) {\n const sessionSignerPrivateKey =\n store.getState().signers[userAddress] ??\n (() => {\n const privateKey = generatePrivateKey();\n store.setState((state) => ({\n signers: {\n ...state.signers,\n [userAddress]: privateKey,\n },\n }));\n return privateKey;\n })();\n\n return privateKeyToAccount(sessionSignerPrivateKey);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { getSessionSigner } from \"./getSessionSigner\";\nimport { toCoinbaseSmartAccount } from \"./smart-account/toCoinbaseSmartAccount\";\nimport { SmartAccount } from \"viem/account-abstraction\";\n\nexport async function getSessionAccount<chain extends Chain>({\n client,\n userAddress,\n}: {\n client: Client<Transport, chain>;\n userAddress: Address;\n}): Promise<SmartAccount> {\n const sessionSigner = getSessionSigner(userAddress);\n return await toCoinbaseSmartAccount({ client, owners: [sessionSigner] });\n}\n","import { useDisconnect } from \"wagmi\";\nimport { useENS } from \"../useENS\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { Button } from \"../ui/Button\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { Hex } from \"viem\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useDisconnect();\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\n // TODO: display disconnect error as popover near button?\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Account</div>\n <div className=\"font-mono text-white\">{ens?.name ?? <TruncatedHex hex={userAddress} />}</div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={disconnectIsPending}\n onClick={() => {\n closeAccountModal();\n disconnect();\n }}\n >\n Sign out\n </Button>\n </div>\n {isExpanded ? (\n <p className=\"text-sm\">Each of your onchain actions in this app is associated with your account.</p>\n ) : null}\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\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 { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { quarryPassIssuer } from \"../transports/quarryPassIssuer\";\n\nexport function useClaimGasPass() {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n\n const mutationKey = [\"claimGasPass\", chain.id];\n return useMutation({\n mutationKey,\n onError: (error) => console.error(error),\n mutationFn: async (userAddress: Address) => {\n const transport = quarryPassIssuer()({ chain });\n // TODO: handle case where you already have a pass?\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 Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getAllowance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n retry: 0,\n });\n}\n","import { Address, EIP1193RequestFn, Hex, Transport, http } from \"viem\";\n\nexport type QuarryPassIssuerRpcSchema = [\n {\n Method: \"quarry_issuePass\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n {\n Method: \"quarry_claimAllowance\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n];\n\nexport function quarryPassIssuer(): Transport<\"http\", {}, EIP1193RequestFn<QuarryPassIssuerRpcSchema>> {\n return ({ chain }) => {\n if (!chain) throw new Error(\"No chain provided to issuer transport.\");\n\n const url = \"quarryPassIssuer\" in chain.rpcUrls ? chain.rpcUrls.quarryPassIssuer.http[0] : undefined;\n // TODO: add fallback for anvil to do what quarryPassIssuer does internally\n if (!url) throw new Error(`No \\`quarryPassIssuer\\` RPC URL found for chain ${chain.id}.`);\n\n return http(url)({ chain, retryCount: 0 });\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 { 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\";\nimport { minGasBalance } from \"./common\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n userAddress: Hex;\n};\n\nexport function Allowance({ isActive, isExpanded, userAddress }: Props) {\n const allowance = useAllowance(userAddress);\n const claimGasPass = useClaimGasPass();\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (isActive && claimGasPass.status === \"idle\" && allowance.isSuccess && allowance.data < minGasBalance) {\n claimGasPass.mutate(userAddress);\n }\n });\n return () => clearTimeout(timer);\n }, [allowance.data, allowance.isSuccess, claimGasPass, isActive, userAddress]);\n\n // TODO: show error if allowance fails to load\n // TODO: show claim error\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Allowance</div>\n <div className=\"font-mono text-white\">\n {allowance.data != null ? <Balance wei={allowance.data} /> : <PendingIcon className=\"text-sm\" />}\n </div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={allowance.status === \"pending\" || claimGasPass.status === \"pending\"}\n onClick={() => claimGasPass.mutate(userAddress)}\n >\n Top up\n </Button>\n </div>\n {isExpanded ? <p className=\"text-sm\">Your allowance is used to pay for onchain computation.</p> : null}\n </div>\n );\n}\n","import { Hex, encodeFunctionData } 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\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\nimport { defineCall } from \"../utils/defineCall\";\nimport { useClient } from \"wagmi\";\nimport { resourceToHex } from \"@latticexyz/common\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\";\nimport { callWithSignature } from \"../utils/callWithSignature\";\n\nexport function useSetupSession({ userClient }: { userClient: ConnectedClient }) {\n const queryClient = useQueryClient();\n const { chainId, worldAddress, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const mutationKey = [\"setupSession\", client?.chain.id, userClient.account.address];\n return useMutation({\n mutationKey,\n onError: (error) => console.error(error),\n mutationFn: async ({\n sessionClient,\n registerSpender,\n registerDelegation,\n }: {\n sessionClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n }): Promise<void> => {\n if (!client) throw new Error(\"Client not ready.\");\n const sessionAddress = sessionClient.account.address;\n\n console.log(\"setting up session\");\n\n if (userClient.account.type !== \"smart\") {\n const txs: Hex[] = [];\n\n if (registerSpender) {\n console.log(\"registering spender\");\n const tx = await callWithSignature({\n client,\n userClient,\n sessionClient,\n worldAddress: paymasterAddress,\n systemId: resourceToHex({ type: \"system\", namespace: \"\", name: \"SpenderSystem\" }),\n callData: encodeFunctionData({\n abi: paymasterAbi,\n functionName: \"registerSpender\",\n args: [sessionAddress],\n }),\n });\n console.log(\"got spender tx\", tx);\n txs.push(tx);\n }\n\n if (registerDelegation) {\n console.log(\"registering delegation\");\n const tx = await callWithSignature({\n client,\n userClient,\n sessionClient,\n worldAddress,\n systemId: resourceToHex({ type: \"system\", namespace: \"\", name: \"Registration\" }),\n callData: encodeFunctionData({\n abi: IBaseWorldAbi,\n functionName: \"registerDelegation\",\n args: [sessionAddress, unlimitedDelegationControlId, \"0x\"],\n }),\n });\n console.log(\"got delegation tx\", tx);\n txs.push(tx);\n }\n\n if (!txs.length) return;\n\n console.log(\"waiting for\", txs.length, \"receipts\");\n for (const hash of txs) {\n const receipt = await getAction(client, waitForTransactionReceipt, \"waitForTransactionReceipt\")({ hash });\n console.log(\"got tx receipt\", receipt);\n if (receipt.status === \"reverted\") {\n console.error(\"tx reverted?\", receipt);\n }\n }\n } else {\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: [sessionAddress],\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: [sessionAddress, unlimitedDelegationControlId, \"0x\"],\n }),\n );\n }\n\n if (!calls.length) return;\n\n console.log(\"setting up account with\", calls, userClient);\n const hash = await getAction(userClient, sendUserOperation, \"sendUserOperation\")({ calls });\n console.log(\"got user op hash\", hash);\n\n const receipt = await getAction(\n userClient,\n waitForUserOperationReceipt,\n \"waitForUserOperationReceipt\",\n )({ hash });\n console.log(\"got user op receipt\", receipt);\n\n if (!receipt.success) {\n console.error(\"not successful?\", receipt);\n }\n }\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getSpender\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getDelegation\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n retry: 0,\n });\n}\n","import { Chain } from \"viem\";\nimport { writeContract as viem_writeContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\nimport { SignCallOptions, signCall } from \"./signCall\";\nimport CallWithSignatureAbi from \"@latticexyz/world-modules/out/Unstable_CallWithSignatureSystem.sol/Unstable_CallWithSignatureSystem.abi.json\";\nimport { ConnectedClient } from \"../common\";\n\n// TODO: move this to world package or similar\n\nexport type CallWithSignatureOptions<chain extends Chain = Chain> = SignCallOptions<chain> & {\n sessionClient: ConnectedClient;\n};\n\nexport async function callWithSignature<chain extends Chain = Chain>({\n sessionClient,\n ...opts\n}: CallWithSignatureOptions<chain>) {\n const signature = await signCall(opts);\n return getAction(\n sessionClient,\n viem_writeContract,\n \"writeContract\",\n )({\n address: opts.worldAddress,\n abi: CallWithSignatureAbi,\n functionName: \"callWithSignature\",\n args: [opts.userClient.account.address, opts.systemId, opts.callData, signature],\n } as never);\n}\n","import { Address, Chain, Client, Hex, OneOf, Transport, toHex } from \"viem\";\nimport { signTypedData } from \"viem/actions\";\nimport { callWithSignatureTypes } from \"@latticexyz/world/internal\";\nimport { getRecord } from \"./getRecord\";\nimport modulesConfig from \"@latticexyz/world-modules/internal/mud.config\";\nimport { hexToResource } from \"@latticexyz/common\";\nimport { getAction } from \"viem/utils\";\nimport { ConnectedClient } from \"../common\";\n\n// TODO: move this to world package or similar\n\nexport type SignCallOptions<chain extends Chain = Chain> = {\n userClient: ConnectedClient<chain>;\n worldAddress: Address;\n systemId: Hex;\n callData: Hex;\n} & OneOf<{ nonce: bigint } | { client: Client<Transport, chain> }>;\n\nexport async function signCall<chain extends Chain = Chain>({\n userClient,\n worldAddress,\n systemId,\n callData,\n nonce: initialNonce,\n client,\n}: SignCallOptions<chain>) {\n const nonce =\n initialNonce ??\n (client\n ? (\n await getRecord(client, {\n address: worldAddress,\n table: modulesConfig.tables.CallWithSignatureNonces,\n key: { signer: userClient.account.address },\n blockTag: \"pending\",\n })\n ).nonce\n : 0n);\n\n const { namespace: systemNamespace, name: systemName } = hexToResource(systemId);\n\n return await getAction(\n userClient,\n signTypedData,\n \"signTypedData\",\n )({\n account: userClient.account,\n domain: {\n verifyingContract: worldAddress,\n salt: toHex(userClient.chain.id, { size: 32 }),\n },\n types: callWithSignatureTypes,\n primaryType: \"Call\",\n message: {\n signer: userClient.account.address,\n systemNamespace,\n systemName,\n callData,\n nonce,\n },\n });\n}\n","import { Button } from \"../ui/Button\";\nimport { useSetupSession } from \"./useSetupSession\";\nimport { ConnectedClient } from \"../common\";\nimport { useEffect } from \"react\";\nimport { useSessionClient } from \"../useSessionClient\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n};\n\nexport function Session({ isActive, isExpanded, userClient, registerSpender, registerDelegation }: Props) {\n const { data: sessionClient } = useSessionClient(userClient.account.address);\n const setup = useSetupSession({ userClient });\n const hasSession = !registerDelegation && !registerDelegation;\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (isActive && setup.status === \"idle\" && sessionClient && !hasSession) {\n setup.mutate({\n sessionClient,\n registerSpender,\n registerDelegation,\n });\n }\n });\n return () => clearTimeout(timer);\n }, [hasSession, isActive, registerDelegation, registerSpender, sessionClient, setup]);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Session</div>\n <div className=\"font-mono text-white\">{hasSession ? \"Enabled\" : \"Set up\"}</div>\n </div>\n {hasSession ? (\n <Button variant=\"tertiary\" className=\"flex-shrink-0 text-sm p-1 w-28\" autoFocus={isActive} disabled>\n Enabled\n </Button>\n ) : (\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={!sessionClient || setup.status === \"pending\"}\n onClick={\n sessionClient\n ? () =>\n setup.mutate({\n sessionClient,\n registerSpender,\n registerDelegation,\n })\n : undefined\n }\n >\n Enable\n </Button>\n )}\n </div>\n {isExpanded ? (\n <p className=\"text-sm\">You can perform actions in this app without interruptions for approvals.</p>\n ) : null}\n </div>\n );\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UseQueryResult, queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getSessionClient } from \"./getSessionClient\";\nimport { SessionClient } from \"./common\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { useSessionAccount } from \"./useSessionAccount\";\n\nexport function getSessionClientQueryOptions({\n sessionAccount,\n client,\n userAddress,\n worldAddress,\n paymasterAddress,\n}: {\n sessionAccount: SmartAccount | undefined;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n worldAddress: Address;\n paymasterAddress: Address;\n}) {\n const queryKey = [\"getSessionClient\", client?.uid, userAddress, sessionAccount?.address, worldAddress];\n return queryOptions(\n client && userAddress && sessionAccount\n ? {\n queryKey,\n queryFn: () =>\n getSessionClient({\n sessionAccount,\n client,\n userAddress,\n worldAddress,\n paymasterAddress,\n }),\n staleTime: Infinity,\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useSessionClient(userAddress: Address | undefined): UseQueryResult<SessionClient> {\n const { chainId, worldAddress, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n const { data: sessionAccount } = useSessionAccount(userAddress);\n return useQuery(\n getSessionClientQueryOptions({\n sessionAccount,\n userAddress,\n client,\n worldAddress,\n paymasterAddress,\n }),\n );\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { smartAccountActions } from \"permissionless\";\nimport { callFrom } from \"@latticexyz/world/internal\";\nimport { createBundlerClient } from \"./createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\nimport { SessionClient } from \"./common\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\n\nexport async function getSessionClient<chain extends Chain>({\n client,\n userAddress,\n sessionAccount,\n worldAddress,\n paymasterAddress,\n}: {\n client: Client<Transport, chain>;\n userAddress: Address;\n sessionAccount: SmartAccount;\n worldAddress: Address;\n paymasterAddress: Address;\n}): Promise<SessionClient<chain>> {\n const bundlerTransport = getBundlerTransport(client.chain);\n\n const sessionClient = createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account: sessionAccount,\n })\n .extend(smartAccountActions())\n .extend(callFrom({ worldAddress, delegatorAddress: userAddress, publicClient: client }))\n .extend(observer())\n .extend(() => ({ userAddress }));\n\n return sessionClient;\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 { 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 { 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/output\";\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\";\nimport { usePrerequisites } from \"./onboarding/usePrerequisites\";\nimport { useRef } from \"react\";\n\nconst containerClassNames = twMerge(\n \"w-48 p-3 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: userAddress } = useAccount();\n const initialUserAddress = useRef(userAddress);\n\n const prereqs = usePrerequisites(userAddress);\n\n // TODO: fix flash of button state signed in but incomplete onboarding\n const isConnected = status === \"connected\" || (status === \"reconnecting\" && userAddress);\n const isNewConnection = userAddress !== initialUserAddress.current;\n const isSignedIn = prereqs.isSuccess ? prereqs.data.complete : isNewConnection ? false : isConnected;\n\n const buttonLabel = (() => {\n if (prereqs.isSuccess) {\n if (!prereqs.data.hasAllowance) return \"Top up\";\n if (!prereqs.data.hasDelegation || !prereqs.data.isSpender) return \"Set up\";\n }\n return \"Sign in\";\n })();\n\n return (\n <Shadow mode=\"child\">\n {isSignedIn ? (\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)}\n onClick={openAccountModal}\n >\n <span className=\"flex-grow inline-flex gap-2.5 items-center text-left font-medium\">\n {userAddress ? <AccountName address={userAddress} /> : null}\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\",\n \"bg-orange-500 text-white font-medium\",\n \"hover:bg-orange-400\",\n \"active:bg-orange-600\",\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\">{buttonLabel}</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;\n};\n\nexport function AccountName({ address }: Props) {\n const { data: ens } = useENS(address);\n const avatar = 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={ens?.avatar && avatar.isSuccess ? 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 \"transtion duration-300\",\n avatar.isSuccess ? \"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 ens && (!ens.avatar || avatar.isError) ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n </span>\n <span className=\"flex-grow\">{ens?.name ?? <TruncatedHex hex={address} />}</span>\n </>\n );\n}\n","// Exported `useSessionClient` variant and only provides the session client once all prerequisites are met.\n\nimport { useConnectorClient } from \"wagmi\";\nimport { useSessionClient } from \"./useSessionClient\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { usePrerequisites } from \"./onboarding/usePrerequisites\";\nimport { UseQueryResult } from \"@tanstack/react-query\";\nimport { SessionClient } from \"./common\";\n\nexport function useSessionClientReady(): UseQueryResult<SessionClient | undefined> {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n if (userClient.error) console.error(\"Error retrieving user client\", userClient.error);\n\n const userAddress = userClient.data?.account.address;\n const prerequisites = usePrerequisites(userAddress);\n const sessionClient = useSessionClient(userAddress);\n\n if (!userClient.isSuccess) return { ...userClient, data: undefined } as never;\n if (!prerequisites.isSuccess || !prerequisites.data.complete) return { ...prerequisites, data: undefined } as never;\n return sessionClient;\n}\n","import { Chain, Transport } from \"viem\";\nimport { WalletList, connectorsForWallets, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { Config, CreateConfigParameters, createConfig } from \"wagmi\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\nimport { mapObject } from \"@latticexyz/common/utils\";\nimport { wiresaw } from \"./transports/wiresaw\";\n\nexport type CreateWagmiConfigOptions<\n chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport> = Record<chains[number][\"id\"], Transport>,\n> = {\n readonly chainId: number;\n readonly chains: chains;\n readonly transports: transports;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & Pick<CreateConfigParameters<chains, transports>, \"pollingInterval\">;\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n>(config: CreateWagmiConfigOptions<chains, transports>): Config<chains, transports> {\n const { wallets: defaultWallets } = getDefaultWallets();\n const wallets: WalletList = [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n }),\n ],\n },\n ...defaultWallets,\n ];\n\n const connectors = connectorsForWallets(wallets, {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n\n return createConfig({\n connectors,\n chains: config.chains,\n transports: mapObject(config.transports, (transport) => wiresaw(transport)),\n pollingInterval: config.pollingInterval,\n }) as never;\n}\n","import { Wallet } from \"@rainbow-me/rainbowkit\";\nimport { PasskeyConnectorOptions, passkeyConnector } from \"./passkeyConnector\";\n\nconst iconUrl = `data:image/svg+xml;base64,${btoa(\n // eslint-disable-next-line max-len\n '<svg xmlns=\"http://www.w3.org/2000/svg\" shape-rendering=\"geometricPrecision\" text-rendering=\"geometricPrecision\" image-rendering=\"optimizeQuality\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" width=\"512\" height=\"512\" viewBox=\"-64 -32 608 512\"><path d=\"M6.206 425.469A6.202 6.202 0 010 419.263c0-1.771.235-3.517.663-5.245 9.95-78.847 57.22-96.006 100.964-107.256 21.008-5.412 62.901-26.489 57.822-53.668-10.596-9.819-21.113-23.39-22.946-43.63l-1.274.026c-2.932-.044-5.778-.716-8.422-2.217-5.848-3.325-9.051-9.697-10.596-16.958-3.238-22.186-4.058-33.515 7.768-38.464l.096-.035c-1.467-27.37 3.159-67.64-24.944-76.141C154.622 7.1 218.597-30.203 266.627 30.805c53.519 2.801 77.389 78.611 44.154 121.046h-1.405c11.826 4.949 10.045 17.674 7.767 38.464-1.544 7.261-4.747 13.633-10.595 16.958-2.645 1.501-5.481 2.173-8.422 2.217l-1.275-.026c-1.833 20.24-12.376 33.811-22.972 43.63-4.459 23.871 27.275 43.011 49.33 50.997a139.442 139.442 0 004.268 5.525c-7.2 9.941-8.771 22.797-4.564 34.038-17.002 8.763-24.255 29.334-16.479 46.86-11.966 7.55-18.258 21.305-16.609 34.955H6.206zm419.058-105.362a86.778 86.778 0 0019.446-1.641c29.36-5.822 53.152-27.467 62.657-55.823 3.596-10.544 5.071-21.663 4.521-33.341-1.179-23.46-12.193-46.633-29.631-62.369-17.107-15.361-38.342-23.574-61.383-23.042-22.841.507-45.359 11.216-60.187 28.593-14.977 17.551-22.003 39.144-20.921 62.133.585 11.661 3.482 23.016 8.737 34.074 7.741 16.303 19.934 29.735 35.391 39.048l-22.457 20.711 13.232 27.86-29.413 13.973 13.991 29.456-26.769 12.717 16.81 35.374 35.601-16.915 40.375-110.808zm15.239-129.364c13.685 4.869 20.824 19.908 15.954 33.593-4.87 13.685-19.908 20.833-33.593 15.963-13.685-4.87-20.834-19.917-15.963-33.602 4.87-13.685 19.917-20.825 33.602-15.954z\"/></svg>',\n)}`;\n\nexport type PasskeyWalletOptions = PasskeyConnectorOptions;\n\nexport const passkeyWallet = (opts: PasskeyWalletOptions) => (): Wallet => ({\n id: \"passkey\",\n name: \"Passkey\",\n iconUrl,\n iconBackground: \"#fec\",\n createConnector: (walletDetails) => (config) => ({\n ...passkeyConnector(opts)(config),\n ...walletDetails,\n }),\n});\n","import { Account } from \"viem\";\nimport { ToCoinbaseSmartAccountReturnType } from \"./toCoinbaseSmartAccount\";\n\nexport function isCoinbaseSmartAccount(account: Account | undefined): account is ToCoinbaseSmartAccountReturnType {\n return account != null && \"__isCoinbaseSmartAccount\" in account && account.__isCoinbaseSmartAccount === true;\n}\n","import { WalletList, connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { getWallets } from \"./getWallets\";\nimport { CreateConnectorFn } from \"wagmi\";\n\nexport function getConnectors({\n wallets,\n ...config\n}: {\n readonly chainId: number;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & { readonly wallets?: WalletList }): CreateConnectorFn[] {\n return connectorsForWallets(wallets ?? getWallets(config), {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n}\n","import { WalletList, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\n\nexport function getWallets(config: { readonly chainId: number }): WalletList {\n const { wallets: defaultWallets } = getDefaultWallets();\n return [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n }),\n ],\n },\n ...defaultWallets,\n ];\n}\n"],"mappings":"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","names":["defineConfig","input","DialogRoot","DialogPortal","DialogContent","forwardRef","useEffect","useRef","useState","ReactDOM","useResizeObserver","mergeRefs","createContext","useContext","jsx","Context","FrameProvider","frame","children","useMediaQuery","createContext","useContext","RainbowKitProvider","lightTheme","midnightTheme","useChains","getPaymasterAddress","chain","paymasterAddress","jsx","Context","createContext","EntryKitConfigProvider","config","children","useContext","chain","useChains","id","paymasterAddress","getPaymasterAddress","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","event","useCallback","useMemo","useStore","createStore","store","useAccountModal","accountModalOpen","state","openAccountModal","closeAccountModal","toggleAccountModal","open","twMerge","useAccount","useConnectorClient","useAccount","twMerge","twMerge","jsx","jsxs","PendingIcon","className","props","jsx","jsxs","buttonClassName","variant","twMerge","Button","pending","type","className","children","disabled","props","PendingIcon","useConnectModal","useMutation","useConnectors","createClient","custom","getAddress","numberToHex","SwitchChainError","ChainNotConfiguredError","createConnector","createStore","persist","cache","listener","event","smartAccountActions","toWebAuthnAccount","pad","encodeFunctionData","hashMessage","hashTypedData","encodeAbiParameters","stringToHex","size","encodePacked","parseSignature","BaseError","entryPoint07Abi","entryPoint07Address","getUserOperationHash","toSmartAccount","readContract","parseP256Signature","toCoinbaseSmartAccount","parameters","client","owners","nonce","address","entryPoint","factory","factoryAbi","accountToBytes","account","owner","ownerIndex","counter","abi","calls","call","counterBits","factoryData","wrapSignature","hash","toReplaySafeHash","signature","sign","message","domain","types","primaryType","chainId","userOperation","webauthn","toWebAuthnSignature","s","signatureData","getAccount","client","id","publicKeys","cache","publicKey","owners","toWebAuthnAccount","toCoinbaseSmartAccount","bytesToHex","hashMessage","sign","bytesToHex","hexToBytes","concatBytes","utf8ToBytes","getMessageHash","webauthn","authenticatorData","challengeIndexRaw","clientDataJSON","typeIndexRaw","userVerificationRequired","typeIndex","challengeIndex","authenticatorDataBytes","flag","type","clientDataJSONHash","messageHash","sign","parseSignature","serializePublicKey","secp256r1","getCandidatePublicKeys","input","r","s","candidate1","candidate2","hashMessage","findPublicKey","input1","input2","firstDuplicate","getCandidatePublicKeys","recoverPasskeyPublicKey","input","message2","signature2","webauthn2","credential","sign","messageHash2","getMessageHash","publicKey","arr","seen","s","reusePasskey","randomChallenge","bytesToHex","messageHash","hashMessage","signature","webauthn","credential","sign","publicKey","cache","webauthnHash","getMessageHash","passkey","recoverPasskeyPublicKey","state","createCredential","createPasskey","credential","createCredential","cache","state","resourceToHex","parseAbi","worldConfig","defaultClientConfig","unlimitedDelegationControlId","worldTables","worldAbi","viem_createBundlerClient","knownChainFees","createBundlerClient","paymasterAddress","config","chain","viem_createBundlerClient","defaultClientConfig","observer","transactionQueue","createClient","fallback","http","webSocket","privateKeyToAccount","generatePrivateKey","createTransport","numberToHex","entryPoint07Address","formatUserOperationRequest","estimateUserOperationGas","_params","parseEther","formatUserOperation","toPackedUserOperation","getUserOperationHash","entryPoint07Address","entryPoint07Abi","setBalance","writeContract","getAction","sendUserOperation","executor","rpcUserOp","setBalance","parseEther","userOp","formatUserOperation","gas","packedUserOp","toPackedUserOperation","userOpHash","getUserOperationHash","entryPoint07Address","transactionHash","getAction","writeContract","entryPoint07Abi","userOpExecutor","executor","receipts","createTransport","method","params","numberToHex","entryPoint07Address","rpcUserOp","entrypoint","result","sendUserOperation","hash","estimateUserOperationGas","gasEstimator","getTransport","opts","originalRequest","rest","method","params","options","estimateUserOperationGas","http","wiresaw","getTransport","args","getWiresawTransport","transport","wiresawTransport","chainId","receipts","userOpReceipts","method","params","opts","hash","receipt","result","getBundlerTransport","chain","bundlerHttpUrl","bundlerTransport","wiresaw","gasEstimator","http","userOpExecutor","createClient","fallback","webSocket","privateKeyToAccount","generatePrivateKey","transactionQueue","passkeyConnector","chainId","createConnector","config","chain","c","configTransport","transport","wiresaw","paymasterAddress","getPaymasterAddress","bundlerTransport","getBundlerTransport","client","createClient","defaultClientConfig","connected","cache","id","createPasskey","account","getAccount","numberToHex","reusePasskey","params","accounts","SwitchChainError","ChainNotConfiguredError","a","getAddress","_connectInfo","_error","credentialId","createBundlerClient","smartAccountActions","observer","_params","custom","usePasskeyConnector","connector","useConnectors","c","passkeyConnector","twMerge","jsx","jsxs","Logo","className","props","useAppInfo","appInfo","useEntryKitConfig","appName","appOrigin","appIcon","appImage","useQuery","usePreloadImage","url","resolve","reject","image","jsx","jsxs","AppInfo","appName","appIcon","useAppInfo","hasAppIcon","appIconLoading","usePreloadImage","Logo","twMerge","jsx","jsxs","ConnectWallet","userAccount","useAccount","accountModalOpen","useAccountModal","openConnectModal","connectModalOpen","useConnectModal","passkeyConnector","usePasskeyConnector","createPasskey","useMutation","error","reusePasskey","hasPasskey","buttons","Button","AppInfo","useEffect","useMemo","useRef","useState","twMerge","parseEther","minGasBalance","useClient","queryOptions","useQuery","defineStore","parseAbi","paymasterAbi","paymasterConfig","paymasterTables","decodeValueArgs","getKeyTuple","getSchemaTypes","getValueSchema","readContract","getAction","getRecord","client","address","table","key","blockTag","staticData","encodedLengths","dynamicData","abi","getAllowance","client","paymasterAddress","userAddress","getRecord","paymasterTables","getAllowanceQueryOptions","client","paymasterAddress","userAddress","queryKey","queryOptions","getAllowance","useAllowance","chainId","useEntryKitConfig","useClient","useQuery","useClient","queryOptions","useQuery","getSpender","client","paymasterAddress","userAddress","sessionAddress","getRecord","paymasterTables","getSpenderQueryOptions","client","paymasterAddress","userAddress","sessionAddress","queryKey","queryOptions","getSpender","useClient","queryOptions","useQuery","getDelegation","client","worldAddress","userAddress","sessionAddress","getRecord","worldTables","unlimitedDelegationControlId","getDelegationQueryOptions","client","worldAddress","userAddress","sessionAddress","queryKey","queryOptions","getDelegation","queryOptions","useQuery","useQueryClient","useClient","useClient","queryOptions","useQuery","createStore","persist","store","signers","listener","event","generatePrivateKey","privateKeyToAccount","getSessionSigner","userAddress","sessionSignerPrivateKey","store","privateKey","state","getSessionAccount","client","userAddress","sessionSigner","getSessionSigner","toCoinbaseSmartAccount","getSessionAccountQueryOptions","client","userAddress","queryKey","queryOptions","getSessionAccount","useSessionAccount","chainId","useEntryKitConfig","useClient","useQuery","getPrequisitesQueryOptions","queryClient","client","userAddress","paymasterAddress","worldAddress","queryKey","queryOptions","sessionAddress","getSessionAccountQueryOptions","allowance","isSpender","hasDelegation","getAllowanceQueryOptions","getSpenderQueryOptions","getDelegationQueryOptions","hasAllowance","minGasBalance","usePrerequisites","useQueryClient","chainId","useEntryKitConfig","useClient","useQuery","useDisconnect","useQuery","useENS","address","normalizedAddress","data","res","jsx","jsxs","TruncatedHex","hex","jsx","jsxs","Wallet","isActive","isExpanded","userAddress","ens","useENS","disconnect","disconnectIsPending","useDisconnect","closeAccountModal","useAccountModal","TruncatedHex","Button","useMutation","useQueryClient","http","quarryPassIssuer","chain","url","useClaimGasPass","queryClient","useQueryClient","chain","useEntryKitConfig","mutationKey","useMutation","error","userAddress","transport","quarryPassIssuer","twMerge","jsx","jsxs","EthIcon","className","props","formatEther","formatBalance","wei","formatted","magnitude","jsx","jsxs","Balance","wei","formatBalance","EthIcon","useEffect","jsx","jsxs","Allowance","isActive","isExpanded","userAddress","allowance","useAllowance","claimGasPass","useClaimGasPass","useEffect","timer","minGasBalance","Balance","PendingIcon","Button","encodeFunctionData","useMutation","useQueryClient","getAction","sendUserOperation","waitForUserOperationReceipt","waitForTransactionReceipt","useClient","resourceToHex","IBaseWorldAbi","viem_writeContract","getAction","toHex","signTypedData","callWithSignatureTypes","modulesConfig","hexToResource","getAction","signCall","userClient","worldAddress","systemId","callData","initialNonce","client","nonce","getRecord","systemNamespace","systemName","signTypedData","toHex","callWithSignatureTypes","CallWithSignatureAbi","callWithSignature","sessionClient","opts","signature","signCall","getAction","viem_writeContract","useSetupSession","userClient","queryClient","useQueryClient","chainId","worldAddress","paymasterAddress","useEntryKitConfig","client","useClient","mutationKey","useMutation","error","sessionClient","registerSpender","registerDelegation","sessionAddress","txs","tx","callWithSignature","resourceToHex","encodeFunctionData","paymasterAbi","IBaseWorldAbi","unlimitedDelegationControlId","hash","receipt","getAction","waitForTransactionReceipt","calls","worldAbi","sendUserOperation","waitForUserOperationReceipt","useEffect","useClient","queryOptions","useQuery","smartAccountActions","callFrom","observer","getSessionClient","client","userAddress","sessionAccount","worldAddress","paymasterAddress","bundlerTransport","getBundlerTransport","createBundlerClient","smartAccountActions","callFrom","observer","getSessionClientQueryOptions","sessionAccount","client","userAddress","worldAddress","paymasterAddress","queryKey","queryOptions","getSessionClient","useSessionClient","chainId","useEntryKitConfig","useClient","useSessionAccount","useQuery","jsx","jsxs","Session","isActive","isExpanded","userClient","registerSpender","registerDelegation","sessionClient","useSessionClient","setup","useSetupSession","hasSession","useEffect","timer","Button","jsx","ConnectedSteps","userClient","initialUserAddress","userAddress","prerequisites","usePrerequisites","closeAccountModal","useAccountModal","isNewConnection","initialPrerequisites","useRef","useEffect","hasAllowance","isSpender","hasDelegation","steps","useMemo","props","Wallet","Allowance","Session","selectedStepId","useState","nextStep","step","completedSteps","activeStep","activeStepIndex","twMerge","i","isActive","isExpanded","isDisabled","useRef","jsx","AccountModalContent","chainId","useEntryKitConfig","userClient","useConnectorClient","userAddress","useAccount","initialUserAddress","ConnectWallet","ConnectedSteps","useState","ErrorBoundary","twMerge","BaseError","UserRejectedRequestError","jsx","jsxs","ErrorNotice","initialTitle","error","e","title","message","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","Logo","DialogClose","CloseIcon","jsx","jsxs","EntryKitProvider","config","children","EntryKitConfigProvider","AccountModal","useAccount","twMerge","twMerge","Fragment","jsx","jsxs","AccountName","address","ens","useENS","avatar","usePreloadImage","Logo","TruncatedHex","useRef","jsx","jsxs","containerClassNames","twMerge","secondaryClassNames","secondaryInteractiveClassNames","AccountButton","openAccountModal","accountModalOpen","useAccountModal","status","userAddress","useAccount","initialUserAddress","prereqs","usePrerequisites","isConnected","isNewConnection","isSignedIn","buttonLabel","Shadow","AccountName","Logo","PendingIcon","useConnectorClient","useSessionClientReady","chainId","useEntryKitConfig","userClient","useConnectorClient","userAddress","prerequisites","usePrerequisites","sessionClient","useSessionClient","connectorsForWallets","getDefaultWallets","createConfig","iconUrl","passkeyWallet","opts","walletDetails","config","passkeyConnector","mapObject","createWagmiConfig","config","defaultWallets","getDefaultWallets","wallets","passkeyWallet","connectors","connectorsForWallets","createConfig","mapObject","transport","wiresaw","isCoinbaseSmartAccount","account","connectorsForWallets","getDefaultWallets","getWallets","config","defaultWallets","getDefaultWallets","passkeyWallet","getConnectors","wallets","config","connectorsForWallets","getWallets"]}