@latticexyz/entrykit 2.2.23-8150fcd067d3a61e87f7582805a1c129a93731b6 → 2.2.23-84b8926b9c97fd6d0807aa5b84326fe9a698f264

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","../../../../../node_modules/.pnpm/tailwindcss@3.4.13/node_modules/tailwindcss/tailwind.css","../../../src/ui/FrameProvider.tsx","../../../src/useTheme.ts","../../../src/EntryKitConfigProvider.tsx","../../../src/getBundlerTransport.ts","../../../src/quarry/transports/userOpExecutor.ts","../../../src/quarry/transports/methods/estimateUserOperationGas.ts","../../../src/quarry/transports/methods/sendUserOperation.ts","../../../src/debug.ts","../../../src/quarry/debug.ts","../../../src/useAccountModal.ts","../../../src/AccountModal.tsx","../../../src/AccountModalContent.tsx","../../../src/ui/Button.tsx","../../../src/icons/PendingIcon.tsx","../../../src/ConnectWallet.tsx","../../../src/icons/Logo.tsx","../../../src/usePreloadImage.tsx","../../../src/AppInfo.tsx","../../../src/onboarding/ConnectedSteps.tsx","../../../src/onboarding/usePrerequisites.ts","../../../src/onboarding/quarry/useSpender.ts","../../../src/quarry/common.ts","../../../src/onboarding/quarry/getSpender.ts","../../../src/getPaymaster.ts","../../../src/onboarding/useDelegation.ts","../../../src/onboarding/getDelegation.ts","../../../src/common.ts","../../../src/useSessionAccount.ts","../../../src/getSessionAccount.ts","../../../src/getSessionSigner.ts","../../../src/store.ts","../../../src/useFunds.ts","../../../src/onboarding/quarry/useAllowance.ts","../../../src/quarry/getAllowance.ts","../../../src/onboarding/quarry/useBalance.ts","../../../src/quarry/getBalance.ts","../../../src/onboarding/Wallet.tsx","../../../src/useENS.ts","../../../src/ui/TruncatedHex.tsx","../../../src/errors/store.ts","../../../src/errors/useShowMutationError.ts","../../../src/onboarding/quarry/Allowance.tsx","../../../src/onboarding/quarry/useRequestAllowance.ts","../../../src/quarry/transports/quarrySponsor.ts","../../../src/quarry/requestAllowance.ts","../../../src/icons/EthIcon.tsx","../../../src/formatBalance.ts","../../../src/ui/Balance.tsx","../../../src/errors/useShowQueryError.ts","../../../src/onboarding/Session.tsx","../../../src/onboarding/useSetupSession.ts","../../../src/utils/defineCall.ts","../../../src/utils/callWithSignature.ts","../../../src/utils/signCall.ts","../../../src/createBundlerClient.ts","../../../src/actions/cachedFeesPerGas.ts","../../../src/useSessionClient.ts","../../../src/getSessionClient.ts","../../../src/onboarding/GasBalance.tsx","../../../src/data/relayChains.json","../../../src/onboarding/useSetBalance.ts","../../../src/errors/usePrevious.ts","../../../src/icons/IconSVG.tsx","../../../src/icons/CopyIcon.tsx","../../../src/icons/CheckIcon.tsx","../../../src/onboarding/quarry/GasBalance.tsx","../../../src/onboarding/deposit/DepositFormContainer.tsx","../../../src/onboarding/deposit/DepositViaTransferForm.tsx","../../../src/onboarding/deposit/DepositForm.tsx","../../../src/onboarding/deposit/ChainSelect.tsx","../../../src/icons/ChevronUpIcon.tsx","../../../src/icons/ChevronDownIcon.tsx","../../../src/ui/Slot.tsx","../../../src/ui/Input.tsx","../../../src/onboarding/deposit/ChainIcon.tsx","../../../src/onboarding/deposit/PreloadedImage.tsx","../../../src/onboarding/deposit/useRelay.ts","../../../src/onboarding/deposit/useChainBalances.ts","../../../src/onboarding/deposit/AmountInput.tsx","../../../src/onboarding/deposit/SubmitButton.tsx","../../../src/icons/WarningIcon.tsx","../../../src/formatGas.ts","../../../src/onboarding/deposit/useDeposits.ts","../../../src/onboarding/deposit/DepositViaRelayForm.tsx","../../../src/onboarding/deposit/Deposits.tsx","../../../src/onboarding/deposit/TransferDepositStatus.tsx","../../../src/onboarding/deposit/DepositStatus.tsx","../../../src/icons/CloseIcon.tsx","../../../src/onboarding/deposit/RelayDepositStatus.tsx","../../../src/icons/ArrowLeftIcon.tsx","../../../src/onboarding/quarry/WithdrawGasBalanceButton.tsx","../../../src/errors/ErrorOverlay.tsx","../../../src/errors/ErrorFallback.tsx","../../../src/errors/ErrorsOverlay.tsx","../../../src/EntryKitProvider.tsx","../../../src/AccountButton.tsx","../../../src/AccountName.tsx","../../../src/useSessionClientReady.ts","../../../src/createWagmiConfig.ts","../../../src/getDefaultConnectors.ts","../../../src/connectors/walletConnect.ts","../../../src/utils/withFeeCache.ts","../../../src/validateSigner.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, useEffect } from \"react\";\nimport {\n Root as DialogRoot,\n DialogPortal,\n DialogContent,\n DialogTitle,\n DialogDescription,\n} 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 // Focus trapping doesn't seem to completely work with our iframe approach,\n // so tabbing until you get to the document body means Escape doesn't work.\n // We'll patch this behavior for now with our own listener.\n useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented) return;\n\n if (event.key === \"Escape\" && open) {\n event.preventDefault();\n onOpenChange?.(false);\n }\n }\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [onOpenChange, open]);\n\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 className=\"outline-none w-full max-w-[26rem] mx-auto\">\n <DialogTitle className=\"sr-only\">EntryKit</DialogTitle>\n <DialogDescription className=\"sr-only\">Sign in to this app</DialogDescription>\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 // one less than ConnectKit's modal z-index\n // so that ConnectKit can overlap properly\n zIndex: \"2147483645\",\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","*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}/*\n! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */ /* 3 */\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n\n .container {\n max-width: 1536px;\n }\n}\n\n.grid-cols-2.divide-y > :not([hidden]) ~ :not([hidden]):nth-child(-n + 2) {\n border-top-width: 0;\n border-bottom-width: 0;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.pointer-events-none {\n pointer-events: none;\n}\n\n.pointer-events-auto {\n pointer-events: auto;\n}\n\n.fixed {\n position: fixed;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.sticky {\n position: sticky;\n}\n\n.inset-0 {\n inset: 0px;\n}\n\n.bottom-0 {\n bottom: 0px;\n}\n\n.left-0 {\n left: 0px;\n}\n\n.right-0 {\n right: 0px;\n}\n\n.top-0 {\n top: 0px;\n}\n\n.col-start-1 {\n grid-column-start: 1;\n}\n\n.row-start-1 {\n grid-row-start: 1;\n}\n\n.m-0 {\n margin: 0px;\n}\n\n.m-2 {\n margin: 0.5rem;\n}\n\n.-mx-0\\.5 {\n margin-left: -0.125rem;\n margin-right: -0.125rem;\n}\n\n.-my-1 {\n margin-top: -0.25rem;\n margin-bottom: -0.25rem;\n}\n\n.-my-\\[0\\.125em\\] {\n margin-top: -0.125em;\n margin-bottom: -0.125em;\n}\n\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n\n.-ml-3 {\n margin-left: -0.75rem;\n}\n\n.-mr-1 {\n margin-right: -0.25rem;\n}\n\n.-mt-2 {\n margin-top: -0.5rem;\n}\n\n.mt-1 {\n margin-top: 0.25rem;\n}\n\n.mt-4 {\n margin-top: 1rem;\n}\n\n.block {\n display: block;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: flex;\n}\n\n.inline-flex {\n display: inline-flex;\n}\n\n.table {\n display: table;\n}\n\n.grid {\n display: grid;\n}\n\n.inline-grid {\n display: inline-grid;\n}\n\n.contents {\n display: contents;\n}\n\n.hidden {\n display: none;\n}\n\n.aspect-square {\n aspect-ratio: 1 / 1;\n}\n\n.h-10 {\n height: 2.5rem;\n}\n\n.h-12 {\n height: 3rem;\n}\n\n.h-16 {\n height: 4rem;\n}\n\n.h-3 {\n height: 0.75rem;\n}\n\n.h-3\\.5 {\n height: 0.875rem;\n}\n\n.h-4 {\n height: 1rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-64 {\n height: 16rem;\n}\n\n.h-\\[1\\.25em\\] {\n height: 1.25em;\n}\n\n.h-\\[1em\\] {\n height: 1em;\n}\n\n.h-\\[2px\\] {\n height: 2px;\n}\n\n.h-full {\n height: 100%;\n}\n\n.max-h-\\[230px\\] {\n max-height: 230px;\n}\n\n.max-h-full {\n max-height: 100%;\n}\n\n.w-10 {\n width: 2.5rem;\n}\n\n.w-16 {\n width: 4rem;\n}\n\n.w-24 {\n width: 6rem;\n}\n\n.w-28 {\n width: 7rem;\n}\n\n.w-3 {\n width: 0.75rem;\n}\n\n.w-3\\.5 {\n width: 0.875rem;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-48 {\n width: 12rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-60 {\n width: 15rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.w-\\[0\\.6em\\] {\n width: 0.6em;\n}\n\n.w-\\[1\\.25em\\] {\n width: 1.25em;\n}\n\n.w-\\[352px\\] {\n width: 352px;\n}\n\n.w-full {\n width: 100%;\n}\n\n.max-w-\\[26rem\\] {\n max-width: 26rem;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n\n.flex-grow {\n flex-grow: 1;\n}\n\n.-translate-y-2 {\n --tw-translate-y: -0.5rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.-translate-y-4 {\n --tw-translate-y: -1rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.translate-x-2 {\n --tw-translate-x: 0.5rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.translate-y-0 {\n --tw-translate-y: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.scale-50 {\n --tw-scale-x: .5;\n --tw-scale-y: .5;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n@keyframes spin {\n\n to {\n transform: rotate(360deg);\n }\n}\n\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.cursor-text {\n cursor: text;\n}\n\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.grid-cols-\\[1fr_auto_1fr\\] {\n grid-template-columns: 1fr auto 1fr;\n}\n\n.flex-col {\n flex-direction: column;\n}\n\n.place-items-center {\n place-items: center;\n}\n\n.items-end {\n align-items: flex-end;\n}\n\n.items-center {\n align-items: center;\n}\n\n.justify-end {\n justify-content: flex-end;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-between {\n justify-content: space-between;\n}\n\n.gap-1 {\n gap: 0.25rem;\n}\n\n.gap-2 {\n gap: 0.5rem;\n}\n\n.gap-2\\.5 {\n gap: 0.625rem;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.gap-5 {\n gap: 1.25rem;\n}\n\n.gap-6 {\n gap: 1.5rem;\n}\n\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n\n.divide-y > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-y-reverse: 0;\n border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n border-bottom-width: calc(1px * var(--tw-divide-y-reverse));\n}\n\n.divide-neutral-700 > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-divide-opacity));\n}\n\n.divide-neutral-800 > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-opacity: 1;\n border-color: rgb(38 38 38 / var(--tw-divide-opacity));\n}\n\n.self-auto {\n align-self: auto;\n}\n\n.self-center {\n align-self: center;\n}\n\n.overflow-auto {\n overflow: auto;\n}\n\n.overflow-clip {\n overflow: clip;\n}\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.whitespace-nowrap {\n white-space: nowrap;\n}\n\n.whitespace-pre-wrap {\n white-space: pre-wrap;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-2 {\n border-width: 2px;\n}\n\n.border-4 {\n border-width: 4px;\n}\n\n.border-dashed {\n border-style: dashed;\n}\n\n.border-neutral-300 {\n --tw-border-opacity: 1;\n border-color: rgb(212 212 212 / var(--tw-border-opacity));\n}\n\n.border-neutral-700 {\n --tw-border-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-border-opacity));\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.border-white\\/50 {\n border-color: rgb(255 255 255 / 0.5);\n}\n\n.bg-black\\/10 {\n background-color: rgb(0 0 0 / 0.1);\n}\n\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.bg-blue-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(29 78 216 / var(--tw-bg-opacity));\n}\n\n.bg-blue-700\\/60 {\n background-color: rgb(29 78 216 / 0.6);\n}\n\n.bg-green-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(245 245 245 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(38 38 38 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-800\\/85 {\n background-color: rgb(38 38 38 / 0.85);\n}\n\n.bg-neutral-900 {\n --tw-bg-opacity: 1;\n background-color: rgb(23 23 23 / var(--tw-bg-opacity));\n}\n\n.bg-orange-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 115 22 / var(--tw-bg-opacity));\n}\n\n.bg-orange-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(234 88 12 / var(--tw-bg-opacity));\n}\n\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n\n.bg-transparent {\n background-color: transparent;\n}\n\n.bg-gradient-to-b {\n background-image: linear-gradient(to bottom, var(--tw-gradient-stops));\n}\n\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n\n.to-blue-700 {\n --tw-gradient-to: #1d4ed8 var(--tw-gradient-to-position);\n}\n\n.bg-cover {\n background-size: cover;\n}\n\n.bg-center {\n background-position: center;\n}\n\n.bg-no-repeat {\n background-repeat: no-repeat;\n}\n\n.object-cover {\n object-fit: cover;\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-2 {\n padding: 0.5rem;\n}\n\n.p-2\\.5 {\n padding: 0.625rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.p-4 {\n padding: 1rem;\n}\n\n.p-6 {\n padding: 1.5rem;\n}\n\n.p-\\[\\.75em\\] {\n padding: .75em;\n}\n\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.py-8 {\n padding-top: 2rem;\n padding-bottom: 2rem;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem;\n}\n\n.pb-8 {\n padding-bottom: 2rem;\n}\n\n.pt-10 {\n padding-top: 2.5rem;\n}\n\n.pt-8 {\n padding-top: 2rem;\n}\n\n.text-left {\n text-align: left;\n}\n\n.text-center {\n text-align: center;\n}\n\n.font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n\n.text-\\[\\.75em\\] {\n font-size: .75em;\n}\n\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n\n.font-bold {\n font-weight: 700;\n}\n\n.font-medium {\n font-weight: 500;\n}\n\n.leading-loose {\n line-height: 2;\n}\n\n.leading-none {\n line-height: 1;\n}\n\n.tracking-\\[-1ch\\] {\n letter-spacing: -1ch;\n}\n\n.text-amber-500 {\n --tw-text-opacity: 1;\n color: rgb(245 158 11 / var(--tw-text-opacity));\n}\n\n.text-black {\n --tw-text-opacity: 1;\n color: rgb(0 0 0 / var(--tw-text-opacity));\n}\n\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity));\n}\n\n.text-green-600 {\n --tw-text-opacity: 1;\n color: rgb(22 163 74 / var(--tw-text-opacity));\n}\n\n.text-neutral-300 {\n --tw-text-opacity: 1;\n color: rgb(212 212 212 / var(--tw-text-opacity));\n}\n\n.text-neutral-400 {\n --tw-text-opacity: 1;\n color: rgb(163 163 163 / var(--tw-text-opacity));\n}\n\n.text-neutral-500 {\n --tw-text-opacity: 1;\n color: rgb(115 115 115 / var(--tw-text-opacity));\n}\n\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgb(249 115 22 / var(--tw-text-opacity));\n}\n\n.text-transparent {\n color: transparent;\n}\n\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.text-white\\/20 {\n color: rgb(255 255 255 / 0.2);\n}\n\n.text-white\\/50 {\n color: rgb(255 255 255 / 0.5);\n}\n\n.text-white\\/80 {\n color: rgb(255 255 255 / 0.8);\n}\n\n.underline {\n text-decoration-line: underline;\n}\n\n.decoration-neutral-500 {\n text-decoration-color: #737373;\n}\n\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n\n.opacity-0 {\n opacity: 0;\n}\n\n.opacity-100 {\n opacity: 1;\n}\n\n.opacity-25 {\n opacity: 0.25;\n}\n\n.opacity-30 {\n opacity: 0.3;\n}\n\n.opacity-50 {\n opacity: 0.5;\n}\n\n.opacity-75 {\n opacity: 0.75;\n}\n\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.ring-1 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.ring-neutral-700\\/50 {\n --tw-ring-color: rgb(64 64 64 / 0.5);\n}\n\n.ring-transparent {\n --tw-ring-color: transparent;\n}\n\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.duration-100 {\n transition-duration: 100ms;\n}\n\n.duration-300 {\n transition-duration: 300ms;\n}\n\n.ease-linear {\n transition-timing-function: linear;\n}\n\n@keyframes enter {\n\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n\n@keyframes exit {\n\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n\n.animate-in {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n\n.animate-out {\n animation-name: exit;\n animation-duration: 150ms;\n --tw-exit-opacity: initial;\n --tw-exit-scale: initial;\n --tw-exit-rotate: initial;\n --tw-exit-translate-x: initial;\n --tw-exit-translate-y: initial;\n}\n\n.fade-in {\n --tw-enter-opacity: 0;\n}\n\n.fade-out {\n --tw-exit-opacity: 0;\n}\n\n.slide-in-from-bottom-16 {\n --tw-enter-translate-y: 4rem;\n}\n\n.slide-in-from-bottom-2 {\n --tw-enter-translate-y: 0.5rem;\n}\n\n.slide-in-from-bottom-8 {\n --tw-enter-translate-y: 2rem;\n}\n\n.slide-in-from-top-2 {\n --tw-enter-translate-y: -0.5rem;\n}\n\n.animate-duration-300 {\n animation-duration: 300ms;\n}\n\n.ease-linear {\n animation-timing-function: linear;\n}\n\n@property --tw-border-gradient-angle {\n syntax: '<angle>';\n inherits: true;\n initial-value: 0deg;\n}\n\n@property --tw-conic-gradient-angle {\n syntax: '<angle>';\n inherits: true;\n initial-value: 0deg;\n}\n\n@keyframes border-gradient {\n\n to {\n --tw-border-gradient-angle: 360deg;\n }\n}\n\n.placeholder\\:text-neutral-500::placeholder {\n --tw-text-opacity: 1;\n color: rgb(115 115 115 / var(--tw-text-opacity));\n}\n\n.after\\:select-none::after {\n content: var(--tw-content);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.after\\:content-\\[\\'\\2026\\'\\]::after {\n --tw-content: '…';\n content: var(--tw-content);\n}\n\n.focus-within\\:border-transparent:focus-within {\n border-color: transparent;\n}\n\n.focus-within\\:ring-orange-500:focus-within {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(249 115 22 / var(--tw-ring-opacity));\n}\n\n.hover\\:bg-blue-500:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n\n.hover\\:bg-neutral-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(229 229 229 / var(--tw-bg-opacity));\n}\n\n.hover\\:bg-orange-400:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(251 146 60 / var(--tw-bg-opacity));\n}\n\n.hover\\:text-white:hover {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.hover\\:text-white\\/40:hover {\n color: rgb(255 255 255 / 0.4);\n}\n\n.hover\\:text-white\\/80:hover {\n color: rgb(255 255 255 / 0.8);\n}\n\n.hover\\:decoration-orange-500:hover {\n text-decoration-color: #f97316;\n}\n\n.hover\\:brightness-125:hover {\n --tw-brightness: brightness(1.25);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.focus\\:border-orange-500:focus {\n --tw-border-opacity: 1;\n border-color: rgb(249 115 22 / var(--tw-border-opacity));\n}\n\n.focus\\:border-yellow-400:focus {\n --tw-border-opacity: 1;\n border-color: rgb(250 204 21 / var(--tw-border-opacity));\n}\n\n.focus\\:bg-neutral-700:focus {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.active\\:bg-orange-600:active {\n --tw-bg-opacity: 1;\n background-color: rgb(234 88 12 / var(--tw-bg-opacity));\n}\n\n.active\\:brightness-150:active {\n --tw-brightness: brightness(1.5);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.group:hover .group-hover\\:pointer-events-none {\n pointer-events: none;\n}\n\n.group:hover .group-hover\\:pointer-events-auto {\n pointer-events: auto;\n}\n\n.group:hover .group-hover\\:inline-block {\n display: inline-block;\n}\n\n.group:hover .group-hover\\:hidden {\n display: none;\n}\n\n.group:hover .group-hover\\:rotate-90 {\n --tw-rotate: 90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group:hover .group-hover\\:opacity-0 {\n opacity: 0;\n}\n\n.group:hover .group-hover\\:opacity-100 {\n opacity: 1;\n}\n\n.peer:placeholder-shown ~ .peer-placeholder-shown\\:text-neutral-500 {\n --tw-text-opacity: 1;\n color: rgb(115 115 115 / var(--tw-text-opacity));\n}\n\n.aria-busy\\:pointer-events-none[aria-busy=\"true\"] {\n pointer-events: none;\n}\n\n.aria-busy\\:bg-blue-500[aria-busy=\"true\"] {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n\n.aria-disabled\\:pointer-events-none[aria-disabled=\"true\"] {\n pointer-events: none;\n}\n\n.aria-disabled\\:opacity-50[aria-disabled=\"true\"] {\n opacity: 0.5;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:inline {\n display: inline;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:hidden {\n display: none;\n}\n\n.group\\/button[aria-busy=\"true\"] .group-aria-busy\\/button\\:translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:scale-125 {\n --tw-scale-x: 1.25;\n --tw-scale-y: 1.25;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group\\/button[aria-busy=\"true\"] .group-aria-busy\\/button\\:opacity-100 {\n opacity: 1;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:opacity-0 {\n opacity: 0;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:opacity-100 {\n opacity: 1;\n}\n\n.group\\/button[aria-busy=\"true\"] .group-aria-busy\\/button\\:duration-300 {\n transition-duration: 300ms;\n}\n\n.group[aria-expanded=\"true\"] .group-aria-expanded\\:inline {\n display: inline;\n}\n\n.group[aria-expanded=\"true\"] .group-aria-expanded\\:hidden {\n display: none;\n}\n\n.data-\\[highlighted\\]\\:bg-neutral-200[data-highlighted] {\n --tw-bg-opacity: 1;\n background-color: rgb(229 229 229 / var(--tw-bg-opacity));\n}\n\n.data-\\[state\\=checked\\]\\:bg-neutral-900[data-state=\"checked\"] {\n --tw-bg-opacity: 1;\n background-color: rgb(23 23 23 / var(--tw-bg-opacity));\n}\n\n.links\\:font-medium a[href]:not(.links-unset) {\n font-weight: 500;\n}\n\n.links\\:text-white a[href]:not(.links-unset) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.links\\:underline a[href]:not(.links-unset) {\n text-decoration-line: underline;\n}\n\n.links\\:decoration-neutral-500 a[href]:not(.links-unset) {\n text-decoration-color: #737373;\n}\n\n.links\\:underline-offset-4 a[href]:not(.links-unset) {\n text-underline-offset: 4px;\n}\n\n.hover\\:links\\:decoration-orange-500 a[href]:not(.links-unset):hover {\n text-decoration-color: #f97316;\n}\n\n@media (min-width: 640px) {\n\n .sm\\:items-center {\n align-items: center;\n }\n}\n\n.dark\\:border-neutral-700:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-border-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-border-opacity));\n}\n\n.dark\\:bg-neutral-800:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-bg-opacity: 1;\n background-color: rgb(38 38 38 / var(--tw-bg-opacity));\n}\n\n.dark\\:bg-white\\/10:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n background-color: rgb(255 255 255 / 0.1);\n}\n\n.dark\\:text-white:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.dark\\:hover\\:bg-neutral-700:hover:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.\\[\\&_\\>_\\:is\\(dt\\2c dd\\)\\]\\:px-1 > :is(dt,dd) {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n\n.\\[\\&_\\>_dd\\]\\:text-right > dd {\n text-align: right;\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 { createContext, useContext, type ReactNode } from \"react\";\nimport { EntryKitConfig } from \"./config/output\";\nimport { Chain } from \"viem\";\nimport { useChains } from \"wagmi\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\nimport { ConnectKitProvider } from \"connectkit\";\n\ntype ContextValue = EntryKitConfig & {\n chain: Chain;\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 // This throws when no we can't find a bundler to talk to, so use it to validate the chain.\n getBundlerTransport(chain);\n\n return (\n <ConnectKitProvider\n theme=\"midnight\"\n options={{\n // Prevent Wagmi trying to switch chains after connection\n // https://github.com/wevm/wagmi/blob/f5b717ccf8a5b283263cadc984ba00b354bcefae/packages/core/src/connectors/injected.ts#L174-L182\n initialChainId: 0,\n }}\n >\n <Context.Provider value={{ ...config, chain }}>{children}</Context.Provider>\n </ConnectKitProvider>\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 { transactionQueue } from \"@latticexyz/common/actions\";\nimport { Chain, createClient, fallback, http, keccak256, stringToHex, webSocket } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { userOpExecutor } from \"./quarry/transports/userOpExecutor\";\nimport { wiresaw } from \"@latticexyz/common/internal\";\n\nexport function getBundlerTransport(chain: Chain) {\n if (\"wiresaw\" in chain.rpcUrls) {\n return wiresaw();\n }\n\n // TODO: bundler websocket\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n if (bundlerHttpUrl) {\n return http(bundlerHttpUrl);\n }\n\n if (chain.id === 31337) {\n return userOpExecutor({\n executor: createClient({\n chain,\n transport: fallback([webSocket(), http()]),\n account: privateKeyToAccount(keccak256(stringToHex(\"local user op executor\"))),\n pollingInterval: 10,\n }).extend(transactionQueue()),\n fallbackDefaultTransport: http(),\n });\n }\n\n throw new Error(`Chain ${chain.id} config did not include a bundler RPC URL.`);\n}\n","import {\n BundlerRpcSchema,\n EIP1193RequestFn,\n Hash,\n RpcUserOperationReceipt,\n Transport,\n createTransport,\n getAbiItem,\n numberToHex,\n parseEther,\n} from \"viem\";\nimport {\n entryPoint06Abi,\n entryPoint06Address,\n entryPoint07Address,\n entryPoint08Address,\n} from \"viem/account-abstraction\";\nimport { TransportRequestFn } from \"./common\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { sendUserOperation } from \"./methods/sendUserOperation\";\nimport { ConnectedClient } from \"../../common\";\nimport { debug } from \"../debug\";\nimport { getLogs, getTransactionReceipt, setBalance } from \"viem/actions\";\nimport { getUserOperationReceipt } from \"@latticexyz/common/internal\";\n\n// TODO: move to common package?\n\nexport function userOpExecutor({\n executor,\n fallbackDefaultTransport,\n}: {\n executor: ConnectedClient;\n fallbackDefaultTransport: Transport;\n}): Transport {\n return (opts) => {\n debug(\"using a local user op executor\", executor.account.address);\n\n if (executor.chain.id === 31337) {\n debug(\"setting executor balance\");\n setBalance(\n executor.extend(() => ({ mode: \"anvil\" })),\n {\n address: executor.account.address,\n value: parseEther(\"100\"),\n },\n );\n }\n\n const receipts = new Map<Hash, RpcUserOperationReceipt<\"0.7\">>();\n\n // @ts-expect-error TODO\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 [userOpHash] = params;\n if (receipts.has(userOpHash)) return receipts.get(userOpHash)!;\n\n const event = getAbiItem({\n abi: entryPoint06Abi,\n name: \"UserOperationEvent\",\n });\n\n const log = (\n await getLogs(executor, {\n address: [entryPoint06Address, entryPoint07Address, entryPoint08Address],\n event,\n args: { userOpHash },\n })\n ).at(0);\n\n if (!log) return null;\n const hash = log.transactionHash;\n const receipt = await getTransactionReceipt(executor, { hash });\n\n const userOpReceipt = getUserOperationReceipt(userOpHash, {\n ...receipt,\n blobGasPrice: receipt.blobGasPrice ? numberToHex(receipt.blobGasPrice) : undefined,\n blobGasUsed: receipt.blobGasUsed ? numberToHex(receipt.blobGasUsed) : undefined,\n blockNumber: numberToHex(receipt.blockNumber),\n cumulativeGasUsed: numberToHex(receipt.cumulativeGasUsed),\n effectiveGasPrice: numberToHex(receipt.effectiveGasPrice),\n gasUsed: numberToHex(receipt.gasUsed),\n logs: receipt.logs.map((log) => ({\n ...log,\n blockNumber: numberToHex(log.blockNumber),\n logIndex: numberToHex(log.logIndex),\n transactionIndex: numberToHex(log.transactionIndex),\n })),\n status: receipt.status as never,\n transactionIndex: numberToHex(receipt.transactionIndex),\n });\n\n return userOpReceipt;\n }\n\n if (method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas(params);\n }\n\n debug(`userOpExecutor: method \"${method}\" not overridden, falling back to fallback transport`);\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n\n return fallbackRequest({ method, params });\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 { getRpcMethod } from \"../common\";\n\n// TODO: revisit after demo (don't hardcode gas)\n\ntype rpcMethod = getRpcMethod<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: 20_000_000n,\n preVerificationGas: 200_000n,\n verificationGasLimit: 2_000_000n,\n paymasterVerificationGasLimit: 200_000n,\n paymasterPostOpGasLimit: 200_000n,\n });\n}\n","import { RpcUserOperation, RpcUserOperationReceipt, parseEventLogs } from \"viem\";\nimport {\n formatUserOperation,\n toPackedUserOperation,\n getUserOperationHash,\n entryPoint07Address,\n entryPoint07Abi,\n} from \"viem/account-abstraction\";\nimport { waitForTransactionReceipt, writeContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\nimport { ConnectedClient } from \"../../../common\";\n\n// TODO: move to common package?\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: ConnectedClient;\n rpcUserOp: RpcUserOperation<entryPointVersion>;\n}): Promise<\n Pick<RpcUserOperationReceipt<entryPointVersion>, \"success\" | \"userOpHash\"> & {\n receipt: Pick<RpcUserOperationReceipt<entryPointVersion>[\"receipt\"], \"transactionHash\">;\n }\n> {\n const userOp = formatUserOperation(rpcUserOp);\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 });\n\n const receipt = await getAction(\n executor,\n waitForTransactionReceipt,\n \"waitForTransactionReceipt\",\n )({ hash: transactionHash });\n\n // TODO: replace with `getUserOperationReceipt`?\n const parsedLogs = parseEventLogs({\n logs: receipt.logs,\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\" as const,\n });\n\n return {\n success: parsedLogs[0]!.args.success,\n userOpHash,\n receipt,\n };\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"mud:entrykit\");\nexport const error = createDebug(\"mud:entrykit\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"quarry\");\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 { DialogClose } from \"@radix-ui/react-dialog\";\nimport { CloseIcon } from \"./icons/CloseIcon\";\nimport { Logo } from \"./icons/Logo\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { ErrorFallback } from \"./errors/ErrorFallback\";\nimport { ErrorsOverlay } from \"./errors/ErrorsOverlay\";\n\nexport function AccountModal() {\n const { accountModalOpen, toggleAccountModal } = useAccountModal();\n return (\n <Modal open={accountModalOpen} onOpenChange={toggleAccountModal}>\n {accountModalOpen ? (\n <div\n className={twMerge(\n \"relative py-2 ring-1\",\n \"bg-neutral-900 text-neutral-400 ring-neutral-700/50\",\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 <ErrorBoundary FallbackComponent={ErrorFallback}>\n <AccountModalContent />\n <ErrorsOverlay />\n </ErrorBoundary>\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-white/20 hover:text-white/40\",\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 { address: userAddress, connector } = useAccount();\n const userClient = useConnectorClient({ chainId, connector });\n const initialUserAddress = useRef(userAddress);\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n\n return (\n <ConnectedSteps\n connector={connector!}\n userClient={userClient.data}\n initialUserAddress={initialUserAddress.current}\n />\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 { Button } from \"./ui/Button\";\nimport { useModal } from \"connectkit\";\nimport { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useEffect, useRef } from \"react\";\nimport { useConnect, useConnectors } from \"wagmi\";\nimport { IdPlaceConnector, isIdPlaceConnector } from \"@latticexyz/id.place/internal\";\n\nexport function ConnectWallet() {\n const connectors = useConnectors();\n const porto = connectors.find(isIdPlaceConnector);\n\n // TODO: show error states?\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 {porto ? <AccountButton connector={porto} /> : <WalletButton />}\n </div>\n </div>\n );\n}\n\nfunction AccountButton({ connector }: { connector: IdPlaceConnector }) {\n const { setOpen } = useModal();\n const { connect, isPending, error } = useConnect();\n\n if (error) {\n console.error(\"connect error\", error);\n }\n\n return (\n <>\n <Button\n key=\"signin\"\n variant=\"secondary\"\n className=\"self-auto flex justify-center\"\n pending={isPending}\n onClick={() => connect({ connector })}\n autoFocus\n >\n Sign in\n </Button>\n <button\n className=\"text-sm self-center transition text-neutral-500 hover:text-white p-2\"\n onClick={() => setOpen(true)}\n >\n Already have a wallet?\n </button>\n </>\n );\n}\n\nfunction WalletButton() {\n const { open, setOpen } = useModal();\n const hasAutoOpenedRef = useRef(false);\n\n useEffect(() => {\n if (!open && !hasAutoOpenedRef.current) {\n setOpen(true);\n hasAutoOpenedRef.current = true;\n }\n }, [open, setOpen]);\n\n return (\n <>\n <Button\n key=\"create\"\n variant=\"secondary\"\n className=\"self-auto flex justify-center\"\n onClick={() => setOpen(true)}\n autoFocus\n >\n Connect wallet\n </Button>\n </>\n );\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function 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 { 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 { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { Logo } from \"./icons/Logo\";\nimport { usePreloadImage } from \"./usePreloadImage\";\n\nexport function AppInfo() {\n const { appName, appIcon } = useEntryKitConfig();\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 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 { Address } from \"viem\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ConnectedClient } from \"../common\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Wallet } from \"./Wallet\";\nimport { Allowance } from \"./quarry/Allowance\";\nimport { Session } from \"./Session\";\nimport { Step } from \"./common\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { GasBalance } from \"./GasBalance\";\nimport { GasBalance as GasBalanceQuarry } from \"./quarry/GasBalance\";\nimport { Connector } from \"wagmi\";\n\nexport type Props = {\n connector: Connector;\n userClient: ConnectedClient;\n initialUserAddress: Address | undefined;\n};\n\nexport function ConnectedSteps({ connector, userClient, initialUserAddress }: Props) {\n const { chain } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\n const [focusedId, setFocusedId] = useState<string | null>(null);\n\n const userAddress = userClient.account.address;\n const { data: prerequisites, error: prerequisitesError } = usePrerequisites(userAddress);\n\n useEffect(() => {\n if (prerequisitesError) {\n console.error(\"Could not get prerequisites\", prerequisitesError);\n }\n }, [prerequisitesError]);\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 { sessionAddress, hasAllowance, isSpender, hasDelegation, hasGasBalance, hasQuarryGasBalance } =\n 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 const steps: Step[] = [\n {\n id: \"wallet\",\n isComplete: true,\n content: (props) => <Wallet {...props} userAddress={userAddress} />,\n },\n ];\n\n if (!paymaster) {\n if (sessionAddress != null) {\n steps.push({\n id: \"gasBalance\",\n isComplete: !!hasGasBalance,\n content: (props) => <GasBalance {...props} sessionAddress={sessionAddress} />,\n });\n }\n } else if (paymaster.type === \"quarry\") {\n if (paymaster.canSponsor) {\n steps.push({\n id: \"allowance\",\n isComplete: !!hasAllowance,\n content: (props) => <Allowance {...props} userAddress={userAddress} />,\n });\n } else {\n steps.push({\n id: \"gasBalanceQuarry\",\n isComplete: !!hasQuarryGasBalance,\n content: (props) => <GasBalanceQuarry {...props} userAddress={userAddress} />,\n });\n }\n }\n\n steps.push({\n id: \"session\",\n isComplete: !!isSpender && !!hasDelegation,\n content: (props) => (\n <Session\n {...props}\n userClient={userClient}\n connector={connector}\n registerSpender={!isSpender}\n registerDelegation={!hasDelegation}\n />\n ),\n });\n\n return steps;\n }, [\n hasAllowance,\n hasDelegation,\n hasGasBalance,\n hasQuarryGasBalance,\n isSpender,\n paymaster,\n sessionAddress,\n userAddress,\n userClient,\n connector,\n ]);\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 \"px-8 flex flex-col\",\n \"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 const isFocused = focusedId === step.id;\n\n const content = step.content({\n isActive,\n isExpanded,\n isFocused,\n setFocused: (focused: boolean) => setFocusedId(focused ? step.id : null),\n });\n\n if (focusedId) {\n if (step.id === focusedId) {\n return content;\n }\n return null;\n }\n\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 {content}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { Config, useClient, useConfig } from \"wagmi\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getSpenderQueryOptions } from \"./quarry/useSpender\";\nimport { getDelegationQueryOptions } from \"./useDelegation\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { getSessionAccountQueryOptions } from \"../useSessionAccount\";\nimport { getFundsQueryOptions } from \"../useFunds\";\n\nexport function getPrequisitesQueryOptions({\n queryClient,\n config,\n client,\n userAddress,\n worldAddress,\n}: {\n queryClient: QueryClient;\n config: Config;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n worldAddress: Address;\n}) {\n return queryOptions({\n queryKey: [\"getPrerequisites\", client?.uid, userAddress],\n queryFn: async () => {\n if (!client) throw new Error(\"Viem client not ready.\");\n if (!userAddress) throw new Error(\"User not connected.\");\n\n const {\n account: { address: sessionAddress },\n } = await queryClient.fetchQuery(getSessionAccountQueryOptions({ client, userAddress }));\n\n const [funds, spender, hasDelegation] = await Promise.all([\n queryClient.fetchQuery(getFundsQueryOptions({ queryClient, config, client, userAddress })),\n queryClient.fetchQuery(getSpenderQueryOptions({ client, userAddress, sessionAddress })),\n queryClient.fetchQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress })),\n ]);\n\n // TODO: figure out better approach than null for allowance/spender when no quarry paymaster\n const hasAllowance = funds.paymasterAllowance == null || funds.paymasterAllowance > 0n;\n const isSpender = spender == null ? true : spender;\n const hasGasBalance = funds.sessionBalance == null || funds.sessionBalance > 0n;\n const hasQuarryGasBalance = funds.paymasterBalance == null || funds.paymasterBalance > 0n;\n\n return {\n sessionAddress,\n hasAllowance,\n isSpender,\n hasGasBalance,\n hasQuarryGasBalance,\n hasDelegation,\n // we intentionally don't enforce an allowance/gas balance here\n complete: isSpender && hasDelegation,\n };\n },\n retry: false,\n });\n}\n\nexport function usePrerequisites(userAddress: Address | undefined) {\n const queryClient = useQueryClient();\n const config = useConfig();\n const { chainId, 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 config,\n client,\n userAddress,\n worldAddress,\n }),\n queryClient,\n );\n // console.log(\"prereqs\", prereqs.data);\n return prereqs;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getSpender } from \"./getSpender\";\n\nexport function getSpenderQueryOptions({\n client,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getSpender\", client?.uid, userAddress, sessionAddress],\n queryFn:\n client && userAddress && sessionAddress ? () => getSpender({ client, userAddress, sessionAddress }) : skipToken,\n });\n}\n\nexport function useSpender(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSpenderQueryOptions({ client, userAddress, sessionAddress }));\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: import this from quarry-paymaster\n\nexport const paymasterAbi = parseAbi([\n // AllowanceSystem\n \"error AllowanceSystem_InsufficientAllowance(uint256 allowance, uint256 required)\",\n \"error AllowanceSystem_NotAuthorized(address caller, address sponsor, address user)\",\n \"error AllowanceSystem_NotFound(address user, address sponsor)\",\n \"function removeAllowance(address user, address sponsor)\",\n \"function getAllowance(address user) view returns (uint256)\",\n // GrantSystem\n \"error GrantSystem_AllowanceBelowMinimum(uint256 allowance, uint256 min)\",\n \"error GrantSystem_AllowancesLimitReached(uint256 length, uint256 max)\",\n \"error GrantSystem_InsufficientBalance(uint256 balance, uint256 required)\",\n \"function grantAllowance(address user, uint256 allowance) payable\",\n // BalanceSystem\n \"error BalanceSystem_InsufficientBalance(address user, uint256 amount, uint256 balance)\",\n \"function depositTo(address to) payable\",\n \"function withdrawTo(address to, uint256 amount)\",\n // SpenderSystem\n \"error SpenderSystem_AlreadyRegistered(address spender, address user)\",\n \"error SpenderSystem_HasOwnBalance(address spender)\",\n \"function registerSpender(address spender)\",\n // PaymasterSystem\n \"error PaymasterSystem_InsufficientFunds(address user, uint256 maxCost, uint256 availableAllowance, uint256 availableBalance)\",\n \"error PaymasterSystem_OnlyEntryPoint()\",\n]);\n\nexport const paymasterConfig = defineStore({\n namespaces: {\n root: {\n namespace: \"\",\n tables: {\n // Balance gets deposited and is withdrawable\n Balance: {\n schema: {\n user: \"address\",\n balance: \"uint256\",\n },\n key: [\"user\"],\n },\n // Allowance gets granted and is not withdrawable\n // Allowance is organized as a linked list and gets spent from smallest to largest\n Allowance: {\n name: \"AllowanceV2\",\n schema: {\n user: \"address\",\n sponsor: \"address\",\n allowance: \"uint256\",\n next: \"address\",\n previous: \"address\",\n },\n key: [\"user\", \"sponsor\"],\n },\n AllowanceList: {\n schema: {\n user: \"address\",\n first: \"address\",\n length: \"uint256\",\n },\n key: [\"user\"],\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, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"../../quarry/common\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport { getPaymaster } from \"../../getPaymaster\";\n\nexport type GetSpenderParams = {\n client: Client<Transport, Chain>;\n userAddress: Address;\n sessionAddress: Address;\n};\n\nexport async function getSpender({ client, userAddress, sessionAddress }: GetSpenderParams) {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return null;\n\n const record = await getRecord(client, {\n address: paymaster.address,\n table: paymasterTables.Spender,\n key: { spender: sessionAddress },\n blockTag: \"pending\",\n });\n return record.user.toLowerCase() === userAddress.toLowerCase();\n}\n","import { Chain, Hex } from \"viem\";\n\nexport type Paymaster = {\n readonly type: \"simple\" | \"quarry\";\n readonly address: Hex;\n readonly canSponsor?: boolean;\n};\n\nexport function getPaymaster(chain: Chain): Paymaster | undefined {\n const contracts = chain.contracts ?? {};\n\n if (\"quarryPaymaster\" in contracts && contracts.quarryPaymaster != null) {\n if (\"address\" in contracts.quarryPaymaster) {\n return {\n type: \"quarry\",\n address: contracts.quarryPaymaster.address,\n canSponsor: !!chain.rpcUrls.quarrySponsor?.http?.[0],\n };\n }\n }\n\n if (\"paymaster\" in contracts && contracts.paymaster != null) {\n if (\"address\" in contracts.paymaster) {\n return {\n type: \"simple\",\n address: contracts.paymaster.address,\n };\n }\n }\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, 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 return queryOptions({\n queryKey: [\"getDelegation\", client?.uid, worldAddress, userAddress, sessionAddress],\n queryFn:\n client && userAddress && sessionAddress\n ? () => getDelegation({ client, worldAddress, userAddress, sessionAddress })\n : skipToken,\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, Client } from \"viem\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport { unlimitedDelegationControlId, worldTables } from \"../common\";\n\nexport type GetDelegationParams = {\n client: Client;\n worldAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n blockTag?: \"pending\" | \"latest\";\n};\n\n// TODO: rename to `hasDelegation`?\nexport async function getDelegation({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n // TODO: move everything to latest instead of pending\n blockTag = \"pending\",\n}: GetDelegationParams) {\n const record = await getRecord(client, {\n address: worldAddress,\n table: worldTables.UserDelegationControl,\n key: { delegator: userAddress, delegatee: sessionAddress },\n blockTag,\n });\n return record.delegationControlId === unlimitedDelegationControlId;\n}\n","import { resourceToHex } from \"@latticexyz/common\";\nimport { Client, Chain, Transport, Account, parseAbi, ClientConfig, Address, LocalAccount } from \"viem\";\nimport worldConfig from \"@latticexyz/world/mud.config\";\nimport { SmartAccount } from \"viem/account-abstraction\";\n\nexport type ConnectedClient<chain extends Chain = Chain> = Client<Transport, chain, Account>;\nexport type SessionClient<chain extends Chain = Chain> = Client<Transport, chain, SmartAccount> & {\n readonly userAddress: Address;\n /**\n * World address used for delegated calls. Assumes a delegation has been set up between the user account and session account.\n */\n readonly worldAddress: Address;\n /** @internal */\n readonly internal_signer: LocalAccount;\n};\n\nexport const defaultClientConfig = {\n pollingInterval: 250,\n} as const satisfies Pick<ClientConfig, \"pollingInterval\">;\n\n// TODO: move to world\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 { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UndefinedInitialDataOptions, UseQueryResult, queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { GetSessionAccountReturnType, getSessionAccount } from \"./getSessionAccount\";\n\nexport function getSessionAccountQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}): UndefinedInitialDataOptions<GetSessionAccountReturnType> {\n return queryOptions<GetSessionAccountReturnType>({\n queryKey: [\"getSessionAccount\", client?.uid, userAddress],\n queryFn: client && userAddress ? () => getSessionAccount({ client, userAddress }) : skipToken,\n staleTime: Infinity,\n // TODO: replace with function to retry only connection errors\n retry: false,\n });\n}\n\nexport function useSessionAccount(userAddress: Address | undefined): UseQueryResult<GetSessionAccountReturnType> {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSessionAccountQueryOptions({ userAddress, client }));\n}\n","import { Address, Chain, Client, LocalAccount, Transport } from \"viem\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { toSimpleSmartAccount } from \"permissionless/accounts\";\nimport { getSessionSigner } from \"./getSessionSigner\";\n\nexport type GetSessionAccountReturnType = {\n readonly account: SmartAccount;\n readonly signer: LocalAccount;\n};\n\nexport async function getSessionAccount<chain extends Chain>({\n client,\n userAddress,\n}: {\n client: Client<Transport, chain>;\n userAddress: Address;\n}): Promise<GetSessionAccountReturnType> {\n const signer = getSessionSigner(userAddress);\n const account = await toSimpleSmartAccount({ client, owner: signer });\n return { account, signer };\n}\n","import { Address, isHex } from \"viem\";\nimport { store } from \"./store\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport function getSessionSigner(userAddress: Address) {\n const label = userAddress.toLowerCase() as Address;\n const sessionSignerPrivateKey =\n store.getState().signers[label] ??\n (() => {\n // attempt to reuse previous AccountKit session\n const deprecatedPrivateKey = localStorage\n .getItem(`mud:appSigner:privateKey:${userAddress.toLowerCase()}`)\n ?.replace(/^\"(.*)\"$/, \"$1\");\n const privateKey = isHex(deprecatedPrivateKey) ? deprecatedPrivateKey : generatePrivateKey();\n store.setState((state) => ({\n signers: {\n ...state.signers,\n [label]: privateKey,\n },\n }));\n return privateKey;\n })();\n\n return privateKeyToAccount(sessionSignerPrivateKey);\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}\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", listener);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { Config, useClient, useConfig } from \"wagmi\";\nimport { getBalanceQueryOptions } from \"wagmi/query\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAllowanceQueryOptions } from \"./onboarding/quarry/useAllowance\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { getSessionAccountQueryOptions } from \"./useSessionAccount\";\nimport { getBalanceQueryOptions as getQuarryBalanceQueryOptions } from \"./onboarding/quarry/useBalance\";\n\nexport function getFundsQueryOptions({\n queryClient,\n config,\n client,\n userAddress,\n}: {\n queryClient: QueryClient;\n config: Config;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getFunds\", client?.uid, userAddress],\n queryFn: async () => {\n if (!client) throw new Error(\"Viem client not ready.\");\n if (!userAddress) throw new Error(\"User not connected.\");\n\n const {\n account: { address: sessionAddress },\n } = await queryClient.fetchQuery(getSessionAccountQueryOptions({ client, userAddress }));\n\n const [sessionBalance, paymasterAllowance, paymasterBalance] = await Promise.all([\n queryClient.fetchQuery(getBalanceQueryOptions(config, { chainId: client.chain.id, address: sessionAddress })),\n queryClient.fetchQuery(getAllowanceQueryOptions({ client, userAddress })),\n queryClient.fetchQuery(getQuarryBalanceQueryOptions({ client, userAddress })),\n ]);\n\n return {\n sessionBalance: sessionBalance?.value ?? null,\n paymasterAllowance,\n paymasterBalance,\n };\n },\n retry: false,\n });\n}\n\nexport function useFunds(userAddress: Address | undefined) {\n const queryClient = useQueryClient();\n const config = useConfig();\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n return useQuery(getFundsQueryOptions({ queryClient, config, client, userAddress }), queryClient);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getAllowance } from \"../../quarry/getAllowance\";\n\nexport function getAllowanceQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getAllowance\", client?.uid, userAddress],\n queryFn: client && userAddress ? () => getAllowance({ client, userAddress }) : skipToken,\n });\n}\n\nexport function useAllowance(userAddress: Address | undefined) {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getAllowanceQueryOptions({ client, userAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\nimport { paymasterAbi } from \"./common\";\nimport { getPaymaster } from \"../getPaymaster\";\n\nexport type GetAllowanceParams = {\n client: Client<Transport, Chain>;\n userAddress: Address;\n};\n\nexport async function getAllowance({ client, userAddress }: GetAllowanceParams): Promise<null | bigint> {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return null;\n\n return await getAction(\n client,\n readContract,\n \"readContract\",\n )({\n address: paymaster.address,\n abi: paymasterAbi,\n functionName: \"getAllowance\",\n args: [userAddress],\n });\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getBalance } from \"../../quarry/getBalance\";\n\nexport function getBalanceQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getBalance\", client?.uid, userAddress],\n queryFn: client && userAddress ? () => getBalance({ client, userAddress }) : skipToken,\n });\n}\n\nexport function useBalance(userAddress: Address | undefined) {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getBalanceQueryOptions({ client, userAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"./common\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport { getPaymaster } from \"../getPaymaster\";\n\nexport type GetBalanceParams = {\n client: Client<Transport, Chain>;\n userAddress: Address;\n};\n\nexport async function getBalance({ client, userAddress }: GetBalanceParams) {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return null;\n\n const record = await getRecord(client, {\n address: paymaster.address,\n table: paymasterTables.Balance,\n key: { user: userAddress },\n blockTag: \"pending\",\n });\n return record.balance;\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\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { StepContentProps } from \"./common\";\n\nexport type Props = StepContentProps & {\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useShowMutationError(useDisconnect());\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\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 { findCause } from \"@latticexyz/common\";\nimport { createStore } from \"zustand/vanilla\";\n\nexport const store = createStore<{\n readonly lastId: number;\n readonly errors: readonly {\n readonly id: number;\n readonly error: Error;\n readonly dismiss?: () => unknown;\n readonly retry?: () => unknown | Promise<unknown>;\n }[];\n}>(() => ({\n lastId: 0,\n errors: [],\n}));\n\nexport function addError({\n error,\n retry,\n dismiss,\n}: {\n error: Error;\n retry?: () => unknown | Promise<unknown>;\n dismiss?: () => unknown;\n}) {\n // no need to let users know they rejected\n if (findCause(error, ({ name }) => name === \"UserRejectedRequestError\")) {\n return;\n }\n\n store.setState((state) => {\n if (state.errors.some((e) => e.error === error)) {\n return {};\n }\n\n const id = state.lastId + 1;\n return {\n lastId: id,\n errors: [\n ...state.errors,\n {\n id,\n error,\n dismiss: dismiss\n ? () => {\n removeError(error);\n dismiss();\n }\n : undefined,\n retry: retry\n ? async () => {\n removeError(error);\n await retry();\n }\n : undefined,\n },\n ],\n };\n });\n\n return () => {\n removeError(error);\n };\n}\n\nexport function removeError(error: Error) {\n store.setState((state) => ({\n errors: state.errors.filter((e) => e.error !== error),\n }));\n}\n","import { UseMutationResult } from \"@tanstack/react-query\";\nimport { addError } from \"./store\";\nimport { useEffect } from \"react\";\n\nexport function useShowMutationError<result extends Pick<UseMutationResult, \"error\" | \"reset\">>(\n result: result,\n): result {\n const { error, reset } = result;\n\n useEffect(() => {\n if (!error) return;\n return addError({ error, dismiss: reset });\n }, [error, reset]);\n\n return result;\n}\n","import { Hex, parseEther } from \"viem\";\nimport { useAllowance } from \"./useAllowance\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\nimport { useRequestAllowance } from \"./useRequestAllowance\";\nimport { Button } from \"../../ui/Button\";\nimport { Balance } from \"../../ui/Balance\";\nimport { useEffect } from \"react\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useShowMutationError } from \"../../errors/useShowMutationError\";\nimport { StepContentProps } from \"../common\";\n\nexport type Props = StepContentProps & {\n userAddress: Hex;\n};\n\nexport function Allowance({ isActive, isExpanded, userAddress }: Props) {\n const allowance = useShowQueryError(useAllowance(userAddress));\n const requestAllowance = useShowMutationError(useRequestAllowance());\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 (\n isActive &&\n requestAllowance.status === \"idle\" &&\n allowance.isSuccess &&\n allowance.data != null &&\n allowance.data < parseEther(\"0.01\")\n ) {\n requestAllowance.mutate(userAddress);\n }\n });\n return () => clearTimeout(timer);\n }, [allowance.data, allowance.isSuccess, requestAllowance, isActive, userAddress]);\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\" || requestAllowance.status === \"pending\"}\n onClick={() => requestAllowance.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 { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { requestAllowance } from \"../../quarry/requestAllowance\";\n\nexport function useRequestAllowance() {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n\n const mutationKey = [\"requestAllowance\", chain.id];\n return useMutation({\n retry: 0,\n mutationKey,\n mutationFn: async (userAddress: Address) => {\n await requestAllowance({ chain, userAddress });\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getAllowance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n });\n}\n","import { Address, EIP1193RequestFn, Transport, http } from \"viem\";\n\nexport type QuarrySponsorRpcSchema = [\n {\n Method: \"sponsor_requestAllowance\";\n Parameters: [receiver: Address];\n ReturnType: { message: string };\n },\n];\n\nexport function quarrySponsor(): Transport<\"http\", {}, EIP1193RequestFn<QuarrySponsorRpcSchema>> {\n return ({ chain }) => {\n if (!chain) throw new Error(\"No chain provided to quarrySponsor transport.\");\n\n const url = \"quarrySponsor\" in chain.rpcUrls ? chain.rpcUrls.quarrySponsor.http[0] : undefined;\n // TODO: add fallback for anvil to do what quarrySponsor does internally\n if (!url) throw new Error(`No \\`quarrySponsor\\` RPC URL found for chain ${chain.id}.`);\n\n return http(url)({ chain, retryCount: 0 });\n };\n}\n","import { Address, Chain } from \"viem\";\nimport { quarrySponsor } from \"./transports/quarrySponsor\";\nimport { debug } from \"./debug\";\n\nexport async function requestAllowance({ chain, userAddress }: { chain: Chain; userAddress: Address }) {\n const transport = quarrySponsor()({ chain });\n\n debug(\"Requesting allowance for\", userAddress);\n await transport.request({\n method: \"sponsor_requestAllowance\",\n params: [userAddress],\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 parsed = parseFloat(formatted);\n\n if (parsed > 0 && parsed < 0.00001) {\n return \"<0.00001\";\n }\n\n const magnitude = Math.floor(parsed).toString().length;\n return parsed.toLocaleString(\"en-US\", { maximumFractionDigits: Math.max(0, 6 - magnitude) });\n}\n","import { EthIcon } from \"../icons/EthIcon\";\nimport { formatBalance } from \"../formatBalance\";\nimport { formatEther } from \"viem\";\n\nexport type Props = {\n wei: bigint;\n};\n\nexport function Balance({ wei }: Props) {\n return (\n <span className=\"inline-flex items-center gap-1\" title={formatEther(wei)}>\n {formatBalance(wei)} <EthIcon />\n </span>\n );\n}\n","import { UseQueryResult } from \"@tanstack/react-query\";\nimport { addError } from \"./store\";\nimport { useEffect } from \"react\";\n\nexport function useShowQueryError<result extends Pick<UseQueryResult, \"error\" | \"refetch\">>(result: result): result {\n const { error, refetch } = result;\n\n useEffect(() => {\n if (!error) return;\n return addError({ error, retry: refetch, dismiss: () => {} });\n }, [error, refetch]);\n\n return result;\n}\n","import { useEffect } from \"react\";\nimport { Hex } from \"viem\";\nimport { Button } from \"../ui/Button\";\nimport { useSetupSession } from \"./useSetupSession\";\nimport { ConnectedClient } from \"../common\";\nimport { useSessionClient } from \"../useSessionClient\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { StepContentProps } from \"./common\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Connector } from \"wagmi\";\n\nexport type Props = StepContentProps & {\n connector: Connector;\n userClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n sessionAddress?: Hex;\n};\n\nexport function Session({ isActive, isExpanded, connector, userClient, registerSpender, registerDelegation }: Props) {\n const sessionClient = useShowQueryError(useSessionClient(userClient.account.address));\n const setup = useShowMutationError(useSetupSession({ userClient, connector }));\n const hasSession = !registerDelegation && !registerDelegation;\n const { data: prerequisites } = usePrerequisites(userClient.account.address);\n const { hasAllowance, hasGasBalance, hasQuarryGasBalance } = prerequisites ?? {};\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 (\n isActive &&\n setup.status === \"idle\" &&\n sessionClient.data &&\n !hasSession &&\n (hasAllowance || hasGasBalance || hasQuarryGasBalance)\n ) {\n // TODO: re-enable once we can catch/handle window.open errors in popup\n // https://github.com/ithacaxyz/porto/issues/581\n // setup.mutate({\n // sessionClient: sessionClient.data,\n // registerSpender,\n // registerDelegation,\n // });\n }\n });\n return () => clearTimeout(timer);\n }, [\n hasSession,\n isActive,\n registerDelegation,\n registerSpender,\n sessionClient,\n setup,\n hasAllowance,\n hasGasBalance,\n hasQuarryGasBalance,\n ]);\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.data || setup.status === \"pending\"}\n onClick={\n sessionClient.data\n ? () =>\n setup.mutate({\n sessionClient: sessionClient.data,\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 { Hex, encodeFunctionData, parseEventLogs } from \"viem\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { getAction } from \"viem/utils\";\nimport { entryPoint07Abi, sendUserOperation, waitForUserOperationReceipt } from \"viem/account-abstraction\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { ConnectedClient, unlimitedDelegationControlId, worldAbi } from \"../common\";\nimport { paymasterAbi } from \"../quarry/common\";\nimport { sendCalls, waitForTransactionReceipt } from \"viem/actions\";\nimport { defineCall } from \"../utils/defineCall\";\nimport { Connector, useClient } from \"wagmi\";\nimport { resourceToHex } from \"@latticexyz/common\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\";\nimport { callWithSignature } from \"../utils/callWithSignature\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { systemsConfig as worldSystemsConfig } from \"@latticexyz/world/mud.config\";\nimport { createBundlerClient } from \"../createBundlerClient\";\nimport { getBundlerTransport } from \"../getBundlerTransport\";\nimport { isIdPlaceConnector } from \"@latticexyz/id.place/internal\";\nimport { storeEventsAbi } from \"@latticexyz/store\";\n\nexport function useSetupSession({ connector, userClient }: { connector: Connector; userClient: ConnectedClient }) {\n const queryClient = useQueryClient();\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const mutationKey = [\"setupSession\", client?.chain.id, userClient.account.address];\n return useMutation({\n retry: 0,\n mutationKey,\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 paymaster = getPaymaster(client.chain);\n const sessionAddress = sessionClient.account.address;\n\n console.log(\"setting up session\", userClient);\n\n if (isIdPlaceConnector(connector)) {\n // Set up session for smart account wallet\n const calls = [];\n\n if (registerSpender && paymaster?.type === \"quarry\") {\n console.log(\"registering spender\");\n calls.push(\n defineCall({\n to: paymaster.address,\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.account.address, sessionAddress);\n\n const { id } = await getAction(\n userClient,\n sendCalls,\n \"sendCalls\",\n )({\n account: userClient.account,\n calls,\n });\n console.log(\"got send calls ID\", id);\n\n const bundlerClient = createBundlerClient({\n transport: getBundlerTransport(client.chain),\n client,\n });\n\n console.log(\"waiting for receipt\");\n const receipt = await getAction(\n bundlerClient,\n waitForUserOperationReceipt,\n \"waitForUserOperationReceipt\",\n )({ hash: id as Hex });\n\n console.log(\"got result\", receipt);\n console.log(\n \"parsed logs\",\n worldAddress,\n parseEventLogs({\n logs: receipt.logs,\n abi: [\n ...entryPoint07Abi,\n // TODO: export account abi from id package\n // ...abi,\n ...worldAbi,\n ...storeEventsAbi,\n ...calls.flatMap((call) => call.abi as never),\n ],\n }),\n );\n } else if (userClient.account.type === \"smart\") {\n // Set up session for smart account wallet\n const calls = [];\n\n if (registerSpender && paymaster?.type === \"quarry\") {\n console.log(\"registering spender\");\n calls.push(\n defineCall({\n to: paymaster.address,\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 } else {\n // Set up session for EOAs\n const txs: Hex[] = [];\n\n if (registerSpender && paymaster?.type === \"quarry\") {\n console.log(\"registering spender\");\n const tx = await callWithSignature({\n client,\n userClient,\n sessionClient,\n worldAddress: paymaster.address,\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: worldSystemsConfig.systems.RegistrationSystem.systemId,\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 }\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getSpender\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getDelegation\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n });\n}\n","import { Address, ContractFunctionParameters, Abi } from \"viem\";\n\nexport function defineCall<abi extends Abi | readonly unknown[]>(\n call: Omit<ContractFunctionParameters<abi>, \"address\"> & {\n to: Address;\n value?: bigint | undefined;\n },\n) {\n return call;\n}\n","import { Chain, parseErc6492Signature } 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-module-callwithsignature/out/CallWithSignatureSystem.sol/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 rawSignature = await signCall(opts);\n\n // TODO: add support for ERC-6492 inside CallWithSignature module\n const { address, signature } = parseErc6492Signature(rawSignature);\n if (address != null) {\n throw new Error(\n \"ERC-6492 signatures, like from Coinbase Smart Wallet, are not yet supported. Try using a different wallet?\",\n );\n }\n\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-module-callwithsignature/internal\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport moduleConfig from \"@latticexyz/world-module-callwithsignature/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: moduleConfig.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 { Transport, Chain, Client, RpcSchema, EstimateFeesPerGasReturnType } from \"viem\";\nimport {\n BundlerClient,\n BundlerClientConfig,\n SmartAccount,\n createBundlerClient as viem_createBundlerClient,\n} from \"viem/account-abstraction\";\nimport { defaultClientConfig } from \"./common\";\nimport { getPaymaster } from \"./getPaymaster\";\nimport { cachedFeesPerGas } from \"./actions/cachedFeesPerGas\";\n\nexport function createBundlerClient<\n transport extends Transport,\n chain extends Chain = Chain,\n account extends SmartAccount = SmartAccount,\n client extends Client = Client,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n config: BundlerClientConfig<transport, chain, account, client, rpcSchema>,\n): BundlerClient<transport, chain, account, client, rpcSchema> {\n // our generics above enforce this, but `BundlerClientConfig` makes it optional again\n const client = config.client;\n if (!client) throw new Error(\"No `client` provided to `createBundlerClient`.\");\n\n const chain = config.chain ?? client.chain;\n const paymaster = chain ? getPaymaster(chain) : undefined;\n\n // TODO: lift this out to make `createBundlerClient` configurable?\n return viem_createBundlerClient({\n ...defaultClientConfig,\n paymaster: paymaster\n ? {\n getPaymasterData: async () => ({\n paymaster: paymaster.address,\n paymasterData: \"0x\",\n }),\n }\n : undefined,\n userOperation: {\n estimateFeesPerGas: createFeeEstimator(client),\n },\n ...config,\n });\n}\n\nfunction createFeeEstimator(client: Client): undefined | (() => Promise<EstimateFeesPerGasReturnType<\"eip1559\">>) {\n if (!client.chain) return;\n\n // anvil hardcodes fee returned by `eth_maxPriorityFeePerGas`\n // so we override it here to mimick our chains\n // https://github.com/foundry-rs/foundry/pull/8081#issuecomment-2402002485\n // TODO: move this to user op executor transport?\n if (client.chain.id === 31337) {\n return async () => ({ maxFeePerGas: 100_000n, maxPriorityFeePerGas: 0n });\n }\n\n // do our own fee calculation for redstone, garnet, pyrope chains\n // to avoid the default RPC call to `eth_getBlockByNumber`\n // https://github.com/wevm/viem/blob/3aa882692d2c4af3f5e9cc152099e07cde28e551/src/actions/public/estimateFeesPerGas.ts#L132\n if ([690, 17069, 695569].includes(client.chain.id)) {\n return cachedFeesPerGas(client);\n }\n}\n","import { Client, EstimateFeesPerGasReturnType } from \"viem\";\nimport { estimateFeesPerGas } from \"viem/actions\";\n\ntype CachedFeesPerGasOptions = {\n refreshInterval?: number;\n};\n\nexport function cachedFeesPerGas(\n client: Client,\n options: CachedFeesPerGasOptions = { refreshInterval: 10_000 },\n): () => Promise<EstimateFeesPerGasReturnType<\"eip1559\">> {\n let fees: EstimateFeesPerGasReturnType<\"eip1559\"> | null = null;\n\n async function refreshFees() {\n fees = await estimateFeesPerGas(client);\n }\n\n refreshFees();\n setInterval(refreshFees, options.refreshInterval);\n\n return async () => {\n if (fees) return fees;\n fees = await estimateFeesPerGas(client);\n return fees;\n };\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport {\n QueryClient,\n UndefinedInitialDataOptions,\n UseQueryResult,\n queryOptions,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { getSessionClient } from \"./getSessionClient\";\nimport { SessionClient } from \"./common\";\nimport { getSessionAccountQueryOptions } from \"./useSessionAccount\";\n\nexport function getSessionClientQueryOptions({\n queryClient,\n client,\n userAddress,\n worldAddress,\n}: {\n queryClient: QueryClient;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n worldAddress: Address;\n}): UndefinedInitialDataOptions<SessionClient> {\n return queryOptions<SessionClient>({\n queryKey: [\"getSessionClient\", client?.uid, userAddress, worldAddress],\n queryFn: async () => {\n if (!userAddress) throw new Error(\"User not connected.\");\n\n const { account: sessionAccount, signer: sessionSigner } = await queryClient.fetchQuery(\n getSessionAccountQueryOptions({ client, userAddress }),\n );\n return await getSessionClient({\n sessionAccount,\n sessionSigner,\n userAddress,\n worldAddress,\n });\n },\n staleTime: Infinity,\n // TODO: replace with function to retry only connection errors\n retry: false,\n });\n}\n\nexport function useSessionClient(userAddress: Address | undefined): UseQueryResult<SessionClient> {\n const queryClient = useQueryClient();\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(\n getSessionClientQueryOptions({\n queryClient,\n client,\n userAddress,\n worldAddress,\n }),\n );\n}\n","import { Account, Address, Chain, Client, LocalAccount, RpcSchema, Transport } from \"viem\";\nimport { smartAccountActions } from \"permissionless\";\nimport { callFrom, sendUserOperationFrom } from \"@latticexyz/world/internal\";\nimport { createBundlerClient } from \"./createBundlerClient\";\nimport { SessionClient } from \"./common\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\n\nexport async function getSessionClient({\n userAddress,\n sessionAccount,\n sessionSigner,\n worldAddress,\n}: {\n userAddress: Address;\n sessionAccount: SmartAccount;\n sessionSigner: LocalAccount;\n worldAddress: Address;\n}): Promise<SessionClient> {\n const client = sessionAccount.client;\n if (!clientHasChain(client)) {\n throw new Error(\"Session account client had no associated chain.\");\n }\n\n const bundlerClient = createBundlerClient({\n transport: getBundlerTransport(client.chain),\n client,\n account: sessionAccount,\n });\n\n const sessionClient = bundlerClient\n .extend(smartAccountActions)\n .extend(\n callFrom({\n worldAddress,\n delegatorAddress: userAddress,\n publicClient: client,\n }),\n )\n .extend(\n sendUserOperationFrom({\n worldAddress,\n delegatorAddress: userAddress,\n publicClient: client,\n }),\n )\n // TODO: add observer once we conditionally fetch receipts while bridge is open\n .extend(() => ({ userAddress, worldAddress, internal_signer: sessionSigner }));\n\n return sessionClient;\n}\n\nfunction clientHasChain<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n client: Client<transport, chain, account, rpcSchema>,\n): client is Client<transport, Exclude<chain, undefined>, account, rpcSchema> {\n return client.chain != null;\n}\n","import { useEffect, useState } from \"react\";\nimport { Hex, parseEther } from \"viem\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\nimport { Button } from \"../ui/Button\";\nimport { Balance } from \"../ui/Balance\";\nimport { useBalance, useWatchBlockNumber } from \"wagmi\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport relayChains from \"../data/relayChains.json\";\nimport { useSetBalance } from \"./useSetBalance\";\nimport { RelayChains, StepContentProps } from \"./common\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\nimport { usePrevious } from \"../errors/usePrevious\";\nimport { CopyIcon } from \"../icons/CopyIcon\";\nimport { CheckIcon } from \"../icons/CheckIcon\";\n\nexport type Props = StepContentProps & {\n sessionAddress: Hex;\n};\n\nexport function GasBalance({ isActive, isExpanded, sessionAddress }: Props) {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n const [copied, setCopied] = useState(false);\n\n const balance = useShowQueryError(useBalance({ chainId: chain.id, address: sessionAddress }));\n const prevBalance = usePrevious(balance.data);\n useWatchBlockNumber({ onBlockNumber: () => balance.refetch() });\n\n const setBalance = useShowMutationError(useSetBalance());\n const relayChain = (relayChains as RelayChains)[chain.id];\n\n const handleCopy = () => {\n navigator.clipboard.writeText(sessionAddress);\n\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n useEffect(() => {\n if (balance.data != null && prevBalance?.value === 0n && balance.data.value > 0n) {\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] });\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] });\n }\n }, [balance.data, prevBalance, setBalance, sessionAddress, queryClient]);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Gas balance</div>\n <div className=\"font-mono text-white\">\n {balance.data != null ? <Balance wei={balance.data.value} /> : <PendingIcon className=\"text-sm\" />}\n </div>\n </div>\n\n {chain.id === 31337 ? (\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={balance.status === \"pending\" || setBalance.status === \"pending\"}\n onClick={() =>\n setBalance.mutate({\n address: sessionAddress,\n value: parseEther(\"0.01\") + (balance.data?.value ?? 0n),\n })\n }\n >\n Top up\n </Button>\n ) : relayChain != null ? (\n // TODO: convert this to a <ButtonLink>\n <a\n href={`${relayChain.bridgeUrl}?${new URLSearchParams({ toAddress: sessionAddress, amount: \"0.01\" })}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={balance.status === \"pending\"}\n >\n Top up\n </Button>\n </a>\n ) : null}\n </div>\n {isExpanded ? (\n <>\n <p className=\"text-sm\">Your session&apos;s gas balance is used to pay for onchain computation.</p>\n <p className=\"text-sm\">\n Send funds to{\" \"}\n <span\n className=\"inline-flex items-center gap-1 font-mono text-white cursor-pointer hover:text-white/80 transition-colors\"\n onClick={handleCopy}\n title=\"Click to copy\"\n >\n <TruncatedHex hex={sessionAddress} />{\" \"}\n {copied ? <CheckIcon className=\"w-3.5 h-3.5\" /> : <CopyIcon className=\"w-3.5 h-3.5\" />}\n </span>{\" \"}\n on {chain.name} to top up your session balance.\n </p>\n </>\n ) : null}\n </div>\n );\n}\n","{\n \"1\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ethereum\"\n },\n \"10\": {\n \"bridgeUrl\": \"https://relay.link/bridge/optimism\"\n },\n \"56\": {\n \"bridgeUrl\": \"https://relay.link/bridge/bnb\"\n },\n \"100\": {\n \"bridgeUrl\": \"https://relay.link/bridge/gnosis\"\n },\n \"111\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/bob\"\n },\n \"130\": {\n \"bridgeUrl\": \"https://relay.link/bridge/unichain\"\n },\n \"137\": {\n \"bridgeUrl\": \"https://relay.link/bridge/polygon\"\n },\n \"146\": {\n \"bridgeUrl\": \"https://relay.link/bridge/sonic\"\n },\n \"185\": {\n \"bridgeUrl\": \"https://relay.link/bridge/mint\"\n },\n \"288\": {\n \"bridgeUrl\": \"https://relay.link/bridge/boba\"\n },\n \"324\": {\n \"bridgeUrl\": \"https://relay.link/bridge/zksync\"\n },\n \"360\": {\n \"bridgeUrl\": \"https://relay.link/bridge/shape\"\n },\n \"480\": {\n \"bridgeUrl\": \"https://relay.link/bridge/world-chain\"\n },\n \"690\": {\n \"bridgeUrl\": \"https://relay.link/bridge/redstone\"\n },\n \"747\": {\n \"bridgeUrl\": \"https://relay.link/bridge/flow-evm\"\n },\n \"919\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/mode-testnet\"\n },\n \"1101\": {\n \"bridgeUrl\": \"https://relay.link/bridge/polygon-zkevm\"\n },\n \"1135\": {\n \"bridgeUrl\": \"https://relay.link/bridge/lisk\"\n },\n \"1301\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/unichain-sepolia\"\n },\n \"1329\": {\n \"bridgeUrl\": \"https://relay.link/bridge/sei\"\n },\n \"1424\": {\n \"bridgeUrl\": \"https://relay.link/bridge/perennial\"\n },\n \"1514\": {\n \"bridgeUrl\": \"https://relay.link/bridge/story\"\n },\n \"1625\": {\n \"bridgeUrl\": \"https://relay.link/bridge/gravity\"\n },\n \"1868\": {\n \"bridgeUrl\": \"https://relay.link/bridge/soneium\"\n },\n \"1923\": {\n \"bridgeUrl\": \"https://relay.link/bridge/swellchain\"\n },\n \"1993\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/b3\"\n },\n \"1996\": {\n \"bridgeUrl\": \"https://relay.link/bridge/sanko\"\n },\n \"2187\": {\n \"bridgeUrl\": \"https://relay.link/bridge/game7\"\n },\n \"2741\": {\n \"bridgeUrl\": \"https://relay.link/bridge/abstract\"\n },\n \"2911\": {\n \"bridgeUrl\": \"https://relay.link/bridge/hychain\"\n },\n \"4202\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/lisk-sepolia\"\n },\n \"4321\": {\n \"bridgeUrl\": \"https://relay.link/bridge/echos\"\n },\n \"5000\": {\n \"bridgeUrl\": \"https://relay.link/bridge/mantle\"\n },\n \"5112\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ham\"\n },\n \"7560\": {\n \"bridgeUrl\": \"https://relay.link/bridge/cyber\"\n },\n \"7865\": {\n \"bridgeUrl\": \"https://relay.link/bridge/powerloom\"\n },\n \"7897\": {\n \"bridgeUrl\": \"https://relay.link/bridge/arena-z\"\n },\n \"8333\": {\n \"bridgeUrl\": \"https://relay.link/bridge/B3\"\n },\n \"8453\": {\n \"bridgeUrl\": \"https://relay.link/bridge/base\"\n },\n \"9897\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/arena-z-testnet\"\n },\n \"11011\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/shape-sepolia\"\n },\n \"11124\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/abstract\"\n },\n \"13746\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/game7-testnet\"\n },\n \"17000\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/holesky\"\n },\n \"17069\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/garnet\"\n },\n \"17071\": {\n \"bridgeUrl\": \"https://relay.link/bridge/onchain-points\"\n },\n \"33139\": {\n \"bridgeUrl\": \"https://relay.link/bridge/apechain\"\n },\n \"33979\": {\n \"bridgeUrl\": \"https://relay.link/bridge/funki\"\n },\n \"34443\": {\n \"bridgeUrl\": \"https://relay.link/bridge/mode\"\n },\n \"42161\": {\n \"bridgeUrl\": \"https://relay.link/bridge/arbitrum\"\n },\n \"42170\": {\n \"bridgeUrl\": \"https://relay.link/bridge/arbitrum-nova\"\n },\n \"42220\": {\n \"bridgeUrl\": \"https://relay.link/bridge/celo\"\n },\n \"43114\": {\n \"bridgeUrl\": \"https://relay.link/bridge/avalanche\"\n },\n \"55244\": {\n \"bridgeUrl\": \"https://relay.link/bridge/superposition\"\n },\n \"57073\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ink\"\n },\n \"59144\": {\n \"bridgeUrl\": \"https://relay.link/bridge/linea\"\n },\n \"60808\": {\n \"bridgeUrl\": \"https://relay.link/bridge/bob\"\n },\n \"70700\": {\n \"bridgeUrl\": \"https://relay.link/bridge/apex\"\n },\n \"70701\": {\n \"bridgeUrl\": \"https://relay.link/bridge/boss\"\n },\n \"70800\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/apex-testnet\"\n },\n \"70805\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/cloud\"\n },\n \"80002\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/amoy\"\n },\n \"80094\": {\n \"bridgeUrl\": \"https://relay.link/bridge/berachain\"\n },\n \"81457\": {\n \"bridgeUrl\": \"https://relay.link/bridge/blast\"\n },\n \"84532\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/base-sepolia\"\n },\n \"167000\": {\n \"bridgeUrl\": \"https://relay.link/bridge/taiko\"\n },\n \"167009\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/hekla\"\n },\n \"421614\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/arbitrum-sepolia\"\n },\n \"534352\": {\n \"bridgeUrl\": \"https://relay.link/bridge/scroll\"\n },\n \"543210\": {\n \"bridgeUrl\": \"https://relay.link/bridge/zero-network\"\n },\n \"660279\": {\n \"bridgeUrl\": \"https://relay.link/bridge/xai\"\n },\n \"695569\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/pyrope\"\n },\n \"911867\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/odyssey\"\n },\n \"984122\": {\n \"bridgeUrl\": \"https://relay.link/bridge/forma\"\n },\n \"1118190\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/eclipse-testnet\"\n },\n \"3397901\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/funki-testnet\"\n },\n \"3441006\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/manta-pacific-testnet\"\n },\n \"4457845\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/zero-sepolia\"\n },\n \"7777777\": {\n \"bridgeUrl\": \"https://relay.link/bridge/zora\"\n },\n \"8253038\": {\n \"bridgeUrl\": \"https://relay.link/bridge/bitcoin\"\n },\n \"9092725\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/bitcoin-testnet4\"\n },\n \"9286185\": {\n \"bridgeUrl\": \"https://relay.link/bridge/eclipse\"\n },\n \"11155111\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/sepolia\"\n },\n \"11155420\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/op-sepolia\"\n },\n \"666666666\": {\n \"bridgeUrl\": \"https://relay.link/bridge/degen\"\n },\n \"792703809\": {\n \"bridgeUrl\": \"https://relay.link/bridge/solana\"\n },\n \"845320008\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/lordchain-testnet\"\n },\n \"888888888\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ancient8\"\n },\n \"999999999\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/zora-sepolia\"\n },\n \"1380012617\": {\n \"bridgeUrl\": \"https://relay.link/bridge/rari\"\n },\n \"1936682084\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/solana-devnet\"\n },\n \"88153591557\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/arbitrum-blueberry\"\n }\n}\n","import { useQueryClient, useMutation } from \"@tanstack/react-query\";\nimport { SetBalanceParameters, TestClient } from \"viem\";\nimport { setBalance } from \"viem/actions\";\nimport { useClient } from \"wagmi\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\n\n/**\n * Set balance at address. This assumes the configured chain is an Anvil chain and supports `anvil_setAccountBalance`.\n */\nexport function useSetBalance() {\n const queryClient = useQueryClient();\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n return useMutation({\n retry: 0,\n mutationKey: [\"setBalance\", chainId],\n mutationFn: async (params: SetBalanceParameters) => {\n if (!client) return null;\n\n await setBalance({ ...(client as TestClient), mode: \"anvil\" }, params);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"balance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n\n return null;\n },\n });\n}\n","import { useEffect, useRef } from \"react\";\n\n// TODO: move to react or common package?\nexport function usePrevious<value, initialValue extends value | undefined>(\n value: value,\n initialValue?: initialValue,\n): initialValue extends undefined ? value | undefined : value {\n const ref = useRef<{ value: value }>();\n useEffect(() => {\n ref.current = { value };\n }, [value]);\n return (ref.current ? ref.current.value : initialValue) as never;\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","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function CopyIcon(props: Props) {\n return (\n <IconSVG {...props}>\n <path\n d=\"M8 5H6C4.89543 5 4 5.89543 4 7V19C4 20.1046 4.89543 21 6 21H16C17.1046 21 18 20.1046 18 19V18M8 5C8 6.10457 8.89543 7 10 7H12C13.1046 7 14 6.10457 14 5M8 5C8 3.89543 8.89543 3 10 3H12C13.1046 3 14 3.89543 14 5M14 5H16C17.1046 5 18 5.89543 18 7V10M20 14H10M10 14L13 11M10 14L13 17\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function CheckIcon(props: Props) {\n return (\n <IconSVG {...props}>\n <path\n d=\"M5 13L9 17L19 7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { useEffect } from \"react\";\nimport { Hex } from \"viem\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\nimport { Button } from \"../../ui/Button\";\nimport { Balance } from \"../../ui/Balance\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useBalance } from \"./useBalance\";\nimport { DepositFormContainer } from \"../deposit/DepositFormContainer\";\nimport { ArrowLeftIcon } from \"../../icons/ArrowLeftIcon\";\nimport { StepContentProps } from \"../common\";\nimport { usePrevious } from \"../../errors/usePrevious\";\nimport { WithdrawGasBalanceButton } from \"./WithdrawGasBalanceButton\";\n\nexport type Props = StepContentProps & {\n userAddress: Hex;\n};\n\nexport function GasBalance({ isActive, isExpanded, isFocused, setFocused, userAddress }: Props) {\n const queryClient = useQueryClient();\n const balance = useShowQueryError(useBalance(userAddress));\n const prevBalance = usePrevious(balance.data || 0n);\n\n useEffect(() => {\n if (balance.data != null && prevBalance === 0n && balance.data > 0n) {\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] });\n setFocused(false);\n }\n }, [balance.data, prevBalance, setFocused, queryClient, userAddress]);\n\n if (isFocused) {\n return (\n <div>\n {isFocused && (\n <div className=\"absolute top-0 left-0\">\n <div\n className=\"flex items-center justify-center w-10 h-10 text-white/20 hover:text-white/40 cursor-pointer\"\n onClick={() => setFocused(false)}\n >\n <ArrowLeftIcon className=\"m-0\" />\n </div>\n </div>\n )}\n <DepositFormContainer />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Gas balance</div>\n <div className=\"font-mono text-white\">\n {balance.data != null ? <Balance wei={balance.data} /> : <PendingIcon className=\"text-sm\" />}\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1 justify-center items-center\">\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={balance.status === \"pending\"}\n onClick={() => setFocused(true)}\n >\n Top up\n </Button>\n\n <WithdrawGasBalanceButton userAddress={userAddress} />\n </div>\n </div>\n {isExpanded ? <p className=\"text-sm\">Your gas balance is used to pay for onchain computation.</p> : null}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useChains, useChainId } from \"wagmi\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { DepositViaTransferForm } from \"./DepositViaTransferForm\";\nimport { DepositViaRelayForm } from \"./DepositViaRelayForm\";\nimport { Deposits } from \"./Deposits\";\n\nexport function DepositFormContainer() {\n const { chainId: destinationChainId } = useEntryKitConfig();\n const chainId = useChainId();\n const chains = useChains();\n const [amount, setAmount] = useState<bigint | undefined>(undefined);\n const [sourceChainId, setSourceChainId] = useState(chainId);\n const sourceChain = chains.find(({ id }) => id === sourceChainId)!;\n\n return (\n <div className=\"pt-10 pb-2\">\n {destinationChainId === sourceChainId ? (\n <DepositViaTransferForm\n amount={amount}\n setAmount={setAmount}\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n />\n ) : (\n <DepositViaRelayForm\n amount={amount}\n setAmount={setAmount}\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n />\n )}\n\n <Deposits />\n </div>\n );\n}\n","import { useAccount, useWriteContract, usePrepareTransactionRequest, usePublicClient } from \"wagmi\";\nimport { Chain, encodeFunctionData } from \"viem\";\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { DepositForm } from \"./DepositForm\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../../getPaymaster\";\nimport { paymasterAbi } from \"../../quarry/common\";\nimport { TransferDeposit, useDeposits } from \"./useDeposits\";\n\ntype Props = {\n amount: bigint | undefined;\n setAmount: (amount: bigint | undefined) => void;\n sourceChain: Chain;\n setSourceChainId: (chainId: number) => void;\n};\n\nexport function DepositViaTransferForm({ amount, setAmount, sourceChain, setSourceChainId }: Props) {\n const { chain } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\n const publicClient = usePublicClient();\n const { address: userAddress } = useAccount();\n const { writeContractAsync } = useWriteContract();\n const { addDeposit } = useDeposits();\n\n if (!userAddress) {\n throw new Error(\"User address not found\");\n }\n\n const { data: gasPrice } = useQuery({\n queryKey: [\"gasPrice\", sourceChain.id],\n queryFn: async () => {\n if (!publicClient) throw new Error(\"Public client not available\");\n return publicClient.getGasPrice();\n },\n refetchInterval: 15000,\n enabled: !!publicClient,\n });\n\n const { data: prepareData, error: prepareError } = usePrepareTransactionRequest({\n to: paymaster?.address,\n data: encodeFunctionData({\n abi: paymasterAbi,\n functionName: \"depositTo\",\n args: [userAddress],\n }),\n value: amount,\n });\n\n const deposit = useMutation({\n mutationKey: [\"depositViaTransfer\", amount?.toString()],\n mutationFn: async () => {\n if (!paymaster) throw new Error(\"Paymaster not found\");\n if (!publicClient) throw new Error(\"Public client not found\");\n if (!amount) throw new Error(\"Amount cannot be 0\");\n\n try {\n const hash = await writeContractAsync({\n address: paymaster.address,\n abi: paymasterAbi,\n functionName: \"depositTo\",\n args: [userAddress],\n value: amount,\n });\n\n const receipt = publicClient.waitForTransactionReceipt({ hash }).then((receipt) => {\n if (receipt.status === \"reverted\") {\n throw new Error(\"Transfer transaction reverted.\");\n }\n return receipt;\n });\n\n const pendingDeposit = {\n type: \"transfer\",\n amount,\n chainL1Id: sourceChain.id,\n chainL2Id: chain.id,\n hash,\n receipt,\n start: new Date(),\n estimatedTime: 1000 * 12,\n isComplete: receipt.then(() => undefined),\n } satisfies TransferDeposit;\n\n addDeposit(pendingDeposit);\n } catch (error) {\n console.error(\"Error while depositing via bridge\", error);\n throw error;\n }\n },\n });\n\n const estimatedFee = prepareData?.gas && gasPrice ? prepareData.gas * gasPrice : undefined;\n return (\n <DepositForm\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n amount={amount}\n setAmount={setAmount}\n estimatedFee={{\n fee: estimatedFee,\n isLoading: (!prepareData && !prepareError) || !gasPrice,\n error: prepareError instanceof Error ? prepareError : undefined,\n }}\n estimatedTime=\"A few seconds\"\n onSubmit={async () => {\n await deposit.mutateAsync();\n }}\n submitButton={\n <SubmitButton\n variant=\"primary\"\n amount={amount}\n chainId={sourceChain.id}\n disabled={!!prepareError || !amount || !userAddress}\n pending={deposit.isPending}\n >\n Deposit\n </SubmitButton>\n }\n />\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { Chain } from \"viem\";\nimport { useAccount, useBalance, useWatchBlockNumber } from \"wagmi\";\nimport { useIsMounted } from \"usehooks-ts\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useBalance as useQuarryBalance } from \"../quarry/useBalance\";\nimport { ChainSelect } from \"./ChainSelect\";\nimport { AmountInput } from \"./AmountInput\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { WarningIcon } from \"../../icons/WarningIcon\";\nimport { formatGas } from \"../../formatGas\";\nimport { Balance } from \"../../ui/Balance\";\n\nexport const DEFAULT_DEPOSIT_AMOUNT = 0.005;\n\nexport type Props = {\n sourceChain: Chain;\n setSourceChainId: (chainId: number) => void;\n amount: bigint | undefined;\n setAmount: (amount: bigint | undefined) => void;\n estimatedFee: {\n fee?: bigint | undefined;\n isLoading?: boolean | undefined;\n error: Error | undefined;\n };\n estimatedTime: string;\n onSubmit: () => Promise<void>;\n submitButton: React.ReactNode;\n};\n\nexport function DepositForm({\n sourceChain,\n setSourceChainId,\n amount,\n setAmount,\n estimatedFee,\n estimatedTime,\n onSubmit,\n submitButton,\n}: Props) {\n const amountInputRef = useRef<HTMLInputElement | null>(null);\n const isMounted = useIsMounted();\n\n const { address: userAddress, chainId: userChainId } = useAccount();\n const balance = useShowQueryError(useBalance({ chainId: sourceChain.id, address: userAddress }));\n const quarryBalance = useShowQueryError(useQuarryBalance(userAddress));\n useWatchBlockNumber({\n onBlockNumber: () => {\n balance.refetch();\n quarryBalance.refetch();\n },\n });\n\n const minimumBalance = amount != null ? amount + (estimatedFee?.fee ?? 0n) : undefined;\n const hasMinimumBalance = balance.data != null ? balance.data.value > (minimumBalance ?? 0n) : undefined;\n\n // Re-focus input if chain ID changes (otherwise the chain select is still in focus)\n useEffect(() => {\n amountInputRef.current?.focus();\n }, [userChainId]);\n\n return (\n <form\n className=\"flex flex-col gap-5\"\n onSubmit={async (event) => {\n event.preventDefault();\n\n try {\n await onSubmit();\n if (isMounted()) {\n setAmount(undefined);\n if (amountInputRef.current) {\n amountInputRef.current.value = \"\";\n }\n }\n } catch (error) {\n // Let's hope each deposit form's wrapper is rendering its own errors\n console.error(\"Error during deposit\", error);\n } finally {\n // Re-focus input after submit (otherwise the submit button is still in focus)\n amountInputRef.current?.focus();\n }\n }}\n >\n <div className=\"flex gap-2\">\n <ChainSelect value={sourceChain.id} onChange={setSourceChainId} />\n <AmountInput ref={amountInputRef} initialAmount={amount} onChange={setAmount} />\n </div>\n\n <dl\n className={twMerge(\n \"grid grid-cols-2 divide-y text-sm leading-loose [&_>_:is(dt,dd)]:px-1 [&_>_dd]:text-right\",\n \"divide-neutral-700 text-neutral-400\",\n )}\n >\n <dt>Available to deposit</dt>\n <dd>\n {balance.isSuccess ? (\n <Balance wei={balance.data.value} />\n ) : balance.isError ? (\n <span title={String(balance.error)}>\n <WarningIcon className=\"inline-block text-amber-500\" />\n </span>\n ) : balance.isLoading ? (\n <PendingIcon className=\"inline-block text-xs\" />\n ) : null}\n </dd>\n\n <dt>Gas balance after deposit</dt>\n <dd>\n <Balance wei={(quarryBalance.data ?? 0n) + (amount ?? 0n)} />\n </dd>\n\n <dt>Estimated fee</dt>\n <dd>\n {estimatedFee.fee ? (\n <>{formatGas(estimatedFee.fee)} gwei</>\n ) : estimatedFee.error ? (\n <span title={String(estimatedFee.error)}>\n <WarningIcon className=\"inline-block text-amber-500\" />\n </span>\n ) : estimatedFee.isLoading ? (\n <PendingIcon className=\"inline-block text-xs\" />\n ) : null}\n </dd>\n <dt>Time to deposit</dt>\n <dd>{estimatedTime}</dd>\n </dl>\n\n {hasMinimumBalance ? submitButton : <SubmitButton disabled>Not enough funds</SubmitButton>}\n </form>\n );\n}\n","import { useEffect, useMemo } from \"react\";\nimport { Chain } from \"viem\";\nimport { useSwitchChain } from \"wagmi\";\nimport { twMerge } from \"tailwind-merge\";\nimport * as Select from \"@radix-ui/react-select\";\nimport { RelayChain } from \"@reservoir0x/relay-sdk\";\nimport { useFrame } from \"../../ui/FrameProvider\";\nimport { useTheme } from \"../../useTheme\";\nimport { ChevronUpIcon } from \"../../icons/ChevronUpIcon\";\nimport { ChevronDownIcon } from \"../../icons/ChevronDownIcon\";\nimport { Input } from \"../../ui/Input\";\nimport { ChainIcon } from \"./ChainIcon\";\nimport { useRelay } from \"./useRelay\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useChainBalances } from \"./useChainBalances\";\nimport { Balance } from \"../../ui/Balance\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\n\nexport type ChainWithRelay = Chain & {\n relayChain?: RelayChain & {\n icon?: Record<string, string>;\n };\n};\n\nexport type Props = {\n value: number;\n onChange: (value: number) => void;\n};\n\nexport function ChainSelect({ value, onChange }: Props) {\n const theme = useTheme();\n const { frame } = useFrame();\n const { chains, switchChain } = useSwitchChain();\n const relay = useRelay();\n const relayChains = relay.data?.chains;\n\n const sourceChains = useMemo(() => {\n return chains\n .map((sourceChain) => {\n const relayChain = relayChains?.find((c) => c.id === sourceChain.id);\n return {\n ...sourceChain,\n relayChain,\n } satisfies ChainWithRelay;\n })\n .filter((c) => c.relayChain);\n }, [chains, relayChains]);\n\n const selectedChain = sourceChains.find((c) => c.id === value)!;\n const { data: chainsBalances, isLoading } = useShowQueryError(useChainBalances({ chains: sourceChains }));\n\n const renderedChains = useMemo(() => {\n if (!chainsBalances) return [];\n const chainsWithBalance = chainsBalances\n .filter(({ balance }) => balance.value > 0n)\n .map(({ chain, balance }) => ({ chain, balance: balance.value }));\n\n return chainsWithBalance.length > 0 ? chainsWithBalance : sourceChains.map((chain) => ({ chain, balance: 0n }));\n }, [chainsBalances, sourceChains]);\n\n useEffect(() => {\n if (\n renderedChains.length > 0 &&\n (!selectedChain || !renderedChains.find((c) => c.chain.id === selectedChain?.id))\n ) {\n const defaultChain = renderedChains[0].chain;\n onChange(defaultChain.id);\n switchChain({ chainId: defaultChain.id });\n }\n }, [value, selectedChain, renderedChains, onChange, switchChain]);\n\n return (\n <Select.Root\n value={value.toString()}\n onValueChange={(value) => {\n if (value) {\n const chain = renderedChains.find((item) => item.chain.id.toString() === value)?.chain;\n if (!chain) throw new Error(`Unknown chain selected: ${value}`);\n onChange(chain.id);\n }\n }}\n >\n <Input asChild>\n <Select.Trigger className=\"group inline-flex items-center justify-center\">\n <Select.Value asChild>\n <ChainIcon\n id={selectedChain?.id}\n name={selectedChain?.name}\n url={selectedChain?.relayChain?.icon?.[theme]}\n className=\"w-8\"\n />\n </Select.Value>\n <Select.Icon asChild>\n <>\n <ChevronDownIcon className=\"text-sm -mr-1 group-aria-expanded:hidden\" />\n <ChevronUpIcon className=\"text-sm -mr-1 hidden group-aria-expanded:inline\" />\n </>\n </Select.Icon>\n </Select.Trigger>\n </Input>\n\n {frame.contentDocument ? (\n <Select.Portal container={frame.contentDocument.body}>\n <Select.Content\n position=\"popper\"\n className=\"w-[352px] max-h-[230px] overflow-y-auto mt-1 animate-in fade-in slide-in-from-top-2\"\n >\n <Select.Viewport>\n <Select.Group\n className={twMerge(\n \"flex flex-col border divide-y\",\n \"bg-neutral-800 text-neutral-300 border-neutral-700 divide-neutral-700\",\n )}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center p-4\">\n <PendingIcon className=\"h-6 w-6 animate-spin text-gray-400\" />\n </div>\n ) : (\n renderedChains.map(({ chain, balance }) => {\n // TODO: figure out why up/down arrow jump to top/bottom rather than cycling through items\n return (\n <Select.Item\n key={chain.id}\n value={chain.id.toString()}\n className={twMerge(\n \"group flex p-2.5 gap-2.5 items-center cursor-pointer outline-none\",\n \"text-white focus:bg-neutral-700 data-[state=checked]:bg-neutral-900\",\n )}\n >\n <ChainIcon id={chain.id} name={chain.name} url={chain.relayChain?.icon?.[theme]} />\n <span className=\"flex-grow flex-shrink-0\">{chain.name}</span>\n <span className=\"flex-shrink-0 font-mono text-sm text-neutral-400\">\n <Balance wei={balance} />\n </span>\n </Select.Item>\n );\n })\n )}\n </Select.Group>\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n ) : null}\n </Select.Root>\n );\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function ChevronUpIcon(props: Props) {\n return (\n <IconSVG viewBox=\"0 0 20 20\" {...props}>\n <path\n d=\"M14.7071 12.7071C14.3166 13.0976 13.6834 13.0976 13.2929 12.7071L10 9.41421L6.70711 12.7071C6.31658 13.0976 5.68342 13.0976 5.29289 12.7071C4.90237 12.3166 4.90237 11.6834 5.29289 11.2929L9.29289 7.29289C9.68342 6.90237 10.3166 6.90237 10.7071 7.29289L14.7071 11.2929C15.0976 11.6834 15.0976 12.3166 14.7071 12.7071Z\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </IconSVG>\n );\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function ChevronDownIcon(props: Props) {\n return (\n <IconSVG viewBox=\"0 0 20 20\" {...props}>\n <path\n d=\"M5.29289 7.29289C5.68342 6.90237 6.31658 6.90237 6.70711 7.29289L10 10.5858L13.2929 7.29289C13.6834 6.90237 14.3166 6.90237 14.7071 7.29289C15.0976 7.68342 15.0976 8.31658 14.7071 8.70711L10.7071 12.7071C10.3166 13.0976 9.68342 13.0976 9.29289 12.7071L5.29289 8.70711C4.90237 8.31658 4.90237 7.68342 5.29289 7.29289Z\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </IconSVG>\n );\n}\n","import { isValidElement, cloneElement, Children } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n// We use this in place of Radix's `Slot` because it's missing the ability to merge class names in a way that is Tailwind friendly\n// See https://github.com/radix-ui/primitives/issues/2631\n\nexport type AsChildProps<DefaultElementProps> =\n | ({ asChild?: false } & DefaultElementProps)\n | { asChild: true; children: React.ReactNode };\n\nexport function Slot({\n children,\n ...props\n}: React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n}) {\n if (isValidElement(children)) {\n return cloneElement(children, {\n ...props,\n ...children.props,\n style: {\n ...props.style,\n ...children.props.style,\n },\n className: twMerge(props.className, children.props.className),\n });\n }\n\n if (Children.count(children) > 1) {\n Children.only(null);\n }\n\n return null;\n}\n","import { CSSProperties, InputHTMLAttributes } from \"react\";\nimport { Slot, type AsChildProps } from \"./Slot\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = AsChildProps<InputHTMLAttributes<HTMLInputElement>> & {\n style?: CSSProperties;\n className?: string;\n};\n\nexport function Input({ asChild, className, ...props }: Props) {\n const Child = asChild ? Slot : \"input\";\n return (\n <Child\n className={twMerge(\n \"p-2.5 gap-1 border text-lg font-medium transition\",\n \"outline-none ring-2 ring-transparent focus-within:ring-orange-500 focus-within:border-transparent\",\n \"bg-neutral-900 border-neutral-700 text-white placeholder:text-neutral-500\",\n className,\n )}\n {...props}\n />\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { PreloadedImage } from \"./PreloadedImage\";\nimport { forwardRef } from \"react\";\n\nexport type Props = {\n id: number;\n name: string;\n url: string | undefined;\n className?: string;\n};\n\nexport const ChainIcon = forwardRef<HTMLSpanElement, Props>(function ChainIcon({ name, url, className }, forwardedRef) {\n return (\n <span\n ref={forwardedRef}\n className={twMerge(\"flex-shrink-0 inline-flex w-6 aspect-square rounded-full overflow-clip\", className)}\n >\n {url ? (\n <PreloadedImage url={url} />\n ) : (\n // TODO: better placeholder\n <span\n className={twMerge(\n \"inline-flex items-center justify-center w-full h-full rounded-full\",\n \"border-2 border-dashed border-white/50 opacity-50\",\n )}\n >\n {name?.slice(0, 1)}\n </span>\n )}\n </span>\n );\n});\n","import { ReactNode } from \"react\";\nimport { usePreloadImage } from \"../../usePreloadImage\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n url: string | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport function PreloadedImage({ url, fallback, className }: Props) {\n const { isSuccess, isLoading } = usePreloadImage(url);\n // TODO: center object + fallback\n // TODO: fade in?\n return (\n <span className={twMerge(\"inline-flex w-full h-full items-center justify-center overflow-clip\", className)}>\n {!isLoading ? isSuccess ? <img src={url} className=\"w-full h-full object-cover\" /> : fallback : null}\n </span>\n );\n}\n","import {\n RelayChain,\n MAINNET_RELAY_API,\n TESTNET_RELAY_API,\n fetchChainConfigs,\n RelayClient,\n createClient,\n LogLevel,\n} from \"@reservoir0x/relay-sdk\";\nimport { UseQueryResult, useQuery } from \"@tanstack/react-query\";\nimport { debug } from \"../../debug\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\n\nexport function useRelay(): UseQueryResult<{ client: RelayClient; chains: RelayChain[] }> {\n const { chain } = useEntryKitConfig();\n const appOrigin = location.host;\n const baseApiUrl = chain.testnet ? TESTNET_RELAY_API : MAINNET_RELAY_API;\n\n return useQuery({\n queryKey: [\"relayChains\", baseApiUrl, appOrigin],\n queryFn: async () => {\n debug(\"fetching relay chains from\", baseApiUrl);\n const chains = await fetchChainConfigs(baseApiUrl);\n\n debug(\"got relay chains\", chains);\n const client = createClient({\n baseApiUrl,\n source: appOrigin,\n chains,\n logLevel: LogLevel.Verbose,\n });\n return { client, chains };\n },\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n staleTime: Infinity,\n });\n}\n","import { useAccount, useConfig as useWagmiConfig } from \"wagmi\";\nimport { getBalance } from \"wagmi/actions\";\nimport { useQuery, skipToken } from \"@tanstack/react-query\";\nimport { isNotNull } from \"@latticexyz/common/utils\";\nimport { ChainWithRelay } from \"./ChainSelect\";\n\ntype Props = {\n chains: ChainWithRelay[];\n};\n\nexport function useChainBalances({ chains }: Props) {\n const { address: userAddress } = useAccount();\n const wagmiConfig = useWagmiConfig();\n const chainIds = chains.map((chain) => chain.id);\n\n return useQuery({\n queryKey: [\"chainBalances\", chainIds, userAddress],\n queryFn: userAddress\n ? async () => {\n const chainBalances = await Promise.allSettled(\n chains.map(async (chain) => {\n const balance = await getBalance(wagmiConfig, { chainId: chain.id, address: userAddress });\n return { chain, balance };\n }),\n );\n\n return chainBalances.map((result) => (result.status === \"fulfilled\" ? result.value : null)).filter(isNotNull);\n }\n : skipToken,\n refetchInterval: 1000 * 60,\n retry: 1,\n });\n}\n","import { formatEther, parseEther } from \"viem\";\nimport { Input } from \"../../ui/Input\";\nimport { twMerge } from \"tailwind-merge\";\nimport { forwardRef } from \"react\";\nimport { EthIcon } from \"../../icons/EthIcon\";\n\nexport type Props = {\n initialAmount: bigint | undefined;\n onChange: (value: bigint | undefined) => void;\n};\n\nexport const AmountInput = forwardRef<HTMLInputElement, Props>(function AmountInput(\n { initialAmount, onChange },\n forwardedRef,\n) {\n return (\n <Input asChild className=\"w-full cursor-text flex items-center\">\n <label>\n <input\n ref={forwardedRef}\n className={twMerge(\"peer flex-grow outline-none bg-transparent\", \"placeholder:text-neutral-500\")}\n placeholder=\"0.005\"\n required\n autoFocus\n defaultValue={initialAmount == null ? \"\" : formatEther(initialAmount)}\n onChange={(event) => {\n const input = event.currentTarget;\n if (input.value.trim() === \"\") {\n input.setCustomValidity(\"\");\n onChange(undefined);\n return;\n }\n\n const value = input.value.trim().replace(/\\.$/, \".0\");\n if (!/^\\d*(\\.\\d+)?$/.test(value)) {\n return input.setCustomValidity(\"Invalid amount.\");\n }\n\n input.setCustomValidity(\"\");\n onChange(parseEther(value));\n }}\n />\n <span className={twMerge(\"flex-shrink-0 text-2xl\", \"peer-placeholder-shown:text-neutral-500\")}>\n <EthIcon />\n </span>\n </label>\n </Input>\n );\n});\n","import { useAccount, useBalance, useSwitchChain } from \"wagmi\";\nimport { Button, type Props as ButtonProps } from \"../../ui/Button\";\nimport { twMerge } from \"tailwind-merge\";\nimport { parseEther } from \"viem\";\n\nexport type Props = Omit<ButtonProps, \"type\"> & {\n amount?: bigint | undefined;\n chainId?: number | undefined;\n};\n\nconst MAX_DEPOSIT_AMOUNT = \"0.1\";\n\nexport function SubmitButton({ amount, chainId, className, ...buttonProps }: Props) {\n const { chainId: userChainId, address: userAddress } = useAccount();\n const { data: userBalance } = useBalance({ address: userAddress });\n const shouldSwitchChain = chainId != null && chainId !== userChainId;\n const switchChain = useSwitchChain();\n\n if (shouldSwitchChain) {\n return (\n <Button\n type=\"button\"\n variant=\"primary\"\n className={twMerge(\"w-full\", className)}\n pending={switchChain.isPending}\n onClick={() => switchChain.switchChain({ chainId })}\n >\n Switch chain\n </Button>\n );\n } else if (amount) {\n if (amount > parseEther(MAX_DEPOSIT_AMOUNT)) {\n return (\n <Button type=\"button\" className={twMerge(\"w-full\", className)} disabled>\n Max amount is {MAX_DEPOSIT_AMOUNT} ETH\n </Button>\n );\n } else if (amount > (userBalance?.value ?? 0n)) {\n return (\n <Button type=\"button\" className={twMerge(\"w-full\", className)} disabled>\n Insufficient balance\n </Button>\n );\n }\n }\n\n return <Button type=\"submit\" className={twMerge(\"w-full\", className)} {...buttonProps} />;\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function WarningIcon(props: Props) {\n return (\n <IconSVG fill=\"none\" {...props}>\n <path\n d=\"M12 9V11M12 15H12.01M5.07183 19H18.9282C20.4678 19 21.4301 17.3333 20.6603 16L13.7321 4C12.9623 2.66667 11.0378 2.66667 10.268 4L3.33978 16C2.56998 17.3333 3.53223 19 5.07183 19Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { formatGwei } from \"viem\";\n\nexport function formatGas(wei: bigint) {\n // TODO: should this support non-ether decimals?\n const formatted = formatGwei(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 { Hex, TransactionReceipt } from \"viem\";\nimport { createStore } from \"zustand/vanilla\";\nimport { useStore } from \"zustand\";\nimport { useCallback, useMemo } from \"react\";\n\nexport type DepositBase = {\n readonly type: \"transfer\" | \"relay\";\n readonly amount: bigint;\n readonly chainL1Id: number;\n readonly chainL2Id: number;\n readonly start: Date;\n readonly estimatedTime: number;\n readonly isComplete: Promise<void>;\n};\n\nexport type TransferDeposit = Omit<DepositBase, \"type\"> & {\n readonly type: \"transfer\";\n readonly hash: Hex;\n readonly receipt: Promise<TransactionReceipt>;\n};\n\nexport type RelayDeposit = Omit<DepositBase, \"type\"> & {\n readonly type: \"relay\";\n readonly requestId: string;\n readonly depositPromise: Promise<unknown>;\n};\n\nexport type Deposit = DepositBase & (TransferDeposit | RelayDeposit);\n\nconst store = createStore<{\n readonly count: number;\n readonly deposits: readonly (Deposit & { readonly uid: string })[];\n}>(() => ({\n count: 0,\n deposits: [],\n}));\n\nexport function useDeposits() {\n const deposits = useStore(store, (state) => state.deposits);\n const addDeposit = useCallback((transaction: Deposit) => {\n store.setState((state) => {\n if (transaction.type === \"relay\") {\n const existingDeposit = state.deposits.find(\n (deposit) => deposit.type === \"relay\" && deposit.requestId === transaction.requestId,\n );\n\n if (existingDeposit) {\n return state;\n }\n }\n\n return {\n count: state.count + 1,\n deposits: [\n ...state.deposits,\n {\n ...transaction,\n uid: `deposit-${state.count}`,\n },\n ],\n };\n });\n }, []);\n\n const removeDeposit = useCallback((uid: string) => {\n store.setState((state) => ({\n deposits: state.deposits.filter((deposit) => deposit.uid !== uid),\n }));\n }, []);\n\n return useMemo(\n () => ({\n deposits,\n addDeposit,\n removeDeposit,\n }),\n [addDeposit, deposits, removeDeposit],\n );\n}\n","import { Chain, encodeFunctionData } from \"viem\";\nimport { useAccount, useWalletClient } from \"wagmi\";\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { Execute } from \"@reservoir0x/relay-sdk\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { DepositForm } from \"./DepositForm\";\nimport { useRelay } from \"./useRelay\";\nimport { useDeposits } from \"./useDeposits\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../../getPaymaster\";\nimport { paymasterAbi } from \"../../quarry/common\";\n\nconst ETH_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\ntype Props = {\n amount: bigint | undefined;\n setAmount: (amount: bigint | undefined) => void;\n sourceChain: Chain;\n setSourceChainId: (chainId: number) => void;\n};\n\nexport function DepositViaRelayForm({ amount, setAmount, sourceChain, setSourceChainId }: Props) {\n const { chain, chainId: destinationChainId } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\n const { data: wallet } = useWalletClient();\n const { address: userAddress } = useAccount();\n const { addDeposit } = useDeposits();\n const { data: relay } = useRelay();\n const relayClient = relay?.client;\n\n const quote = useQuery<Execute>({\n queryKey: [\"relayBridgeQuote\", sourceChain.id, amount?.toString()],\n queryFn: async () => {\n if (!relayClient) throw new Error(\"No Relay client found.\");\n if (!userAddress) throw new Error(\"No user address found.\");\n\n const result = await relayClient.actions.getQuote({\n chainId: sourceChain.id,\n toChainId: destinationChainId,\n currency: ETH_ADDRESS,\n toCurrency: ETH_ADDRESS,\n amount: amount?.toString(),\n tradeType: \"EXACT_OUTPUT\",\n recipient: paymaster?.address,\n wallet,\n txs: [\n {\n to: paymaster?.address,\n data: encodeFunctionData({\n abi: paymasterAbi,\n functionName: \"depositTo\",\n args: [userAddress],\n }),\n value: amount?.toString(),\n },\n ],\n });\n\n if (!result) {\n throw new Error(\"Failed to get relay quote\");\n }\n\n return result as Execute;\n },\n retry: 1,\n refetchInterval: 15_000,\n enabled: !!amount && !!userAddress && !!relayClient,\n });\n\n const deposit = useMutation({\n mutationKey: [\"depositViaRelay\", sourceChain.id, amount?.toString()],\n mutationFn: async ({ quote, amount }: { quote: Execute; amount: bigint }) => {\n if (!relayClient) throw new Error(\"No Relay client found.\");\n if (!wallet) throw new Error(\"No wallet found.\");\n\n try {\n return new Promise((resolve) => {\n const pendingDeposit = relayClient.actions.execute({\n quote,\n wallet,\n onProgress(progress) {\n const currentStep = progress.currentStep;\n const requestId = currentStep?.requestId;\n const currentState = currentStep?.items[0]?.progressState;\n\n if (requestId && currentState === \"validating\") {\n addDeposit({\n type: \"relay\",\n requestId,\n amount,\n chainL1Id: sourceChain.id,\n chainL2Id: destinationChainId,\n start: new Date(),\n estimatedTime: 1000 * 30,\n depositPromise: pendingDeposit,\n isComplete: pendingDeposit.then(() => undefined),\n });\n resolve(undefined);\n }\n },\n });\n });\n } catch (error) {\n console.error(\"Error while depositing via Relay\", error);\n throw error;\n }\n },\n });\n\n const fees = quote.data?.fees;\n const gasFee = BigInt(fees?.gas?.amount ?? 0);\n const relayerFee = BigInt(fees?.relayer?.amount ?? 0);\n const fee = gasFee + relayerFee;\n return (\n <DepositForm\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n amount={amount}\n setAmount={setAmount}\n estimatedFee={{\n fee: fee != null ? BigInt(fee) : undefined,\n isLoading: quote.isLoading,\n error: quote.error instanceof Error ? quote.error : undefined,\n }}\n estimatedTime={\"A few seconds\"}\n onSubmit={async () => {\n if (!quote.data || !amount) return;\n await deposit.mutateAsync({ quote: quote.data, amount });\n }}\n submitButton={\n <SubmitButton\n variant=\"primary\"\n amount={amount}\n chainId={sourceChain.id}\n disabled={quote.isError || !amount}\n pending={deposit.isPending}\n >\n Deposit\n </SubmitButton>\n }\n />\n );\n}\n","import { useEffect } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { TransferDepositStatus } from \"./TransferDepositStatus\";\nimport { RelayDepositStatus } from \"./RelayDepositStatus\";\nimport { useDeposits } from \"./useDeposits\";\nimport { useAccount, useClient } from \"wagmi\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\n\nexport function Deposits() {\n const queryClient = useQueryClient();\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n const { address: userAddress } = useAccount();\n const { deposits, removeDeposit } = useDeposits();\n const { data: isComplete } = useQuery({\n queryKey: [\"depositsComplete\", deposits.map((deposit) => deposit.uid)],\n queryFn: async () => {\n if (!deposits.length) return false;\n await Promise.all(deposits.map((deposit) => deposit.isComplete));\n return true;\n },\n });\n\n useEffect(() => {\n if (isComplete) {\n queryClient.invalidateQueries({ queryKey: [\"balance\"] });\n queryClient.invalidateQueries({ queryKey: [\"getBalance\", client?.uid, userAddress] });\n }\n }, [client?.uid, isComplete, queryClient, userAddress]);\n\n if (!deposits.length) return null;\n\n return (\n <div className=\"flex flex-col gap-1 mt-4\">\n {deposits.map((deposit) => {\n if (deposit.type === \"transfer\") {\n return <TransferDepositStatus key={deposit.uid} {...deposit} onDismiss={() => removeDeposit(deposit.uid)} />;\n } else if (deposit.type === \"relay\") {\n return <RelayDepositStatus key={deposit.uid} {...deposit} onDismiss={() => removeDeposit(deposit.uid)} />;\n }\n })}\n </div>\n );\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { DepositStatus } from \"./DepositStatus\";\nimport { useChains } from \"wagmi\";\nimport { TransferDeposit } from \"./useDeposits\";\nimport { Balance } from \"../../ui/Balance\";\n\nexport type Props = TransferDeposit & { onDismiss: () => void };\n\nexport function TransferDepositStatus({\n amount,\n chainL1Id,\n hash,\n receipt: receiptPromise,\n start,\n estimatedTime,\n onDismiss,\n}: Props) {\n const chains = useChains();\n const chain = chains.find((chain) => chain.id === chainL1Id)!;\n\n const receipt = useQuery({\n queryKey: [\"transferDepositStatus\", hash],\n queryFn: () => receiptPromise,\n });\n\n return (\n <DepositStatus\n status={receipt.status}\n progress={{\n duration: estimatedTime,\n elapsed: Math.min(estimatedTime, Date.now() - start.getTime()),\n }}\n onDismiss={onDismiss}\n >\n {(() => {\n const blockExplorer = chain.blockExplorers?.default.url;\n if (receipt.status === \"pending\") {\n return (\n <>\n Confirming deposit on{\" \"}\n <a\n href={blockExplorer ? `${blockExplorer}/tx/${hash}` : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {chain.name}\n </a>\n …\n </>\n );\n }\n if (receipt.status === \"error\") {\n return (\n <>\n Could not find deposit on{\" \"}\n <a\n href={blockExplorer ? `${blockExplorer}/tx/${hash}` : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {chain.name}\n </a>\n .\n </>\n );\n }\n return (\n <>\n Successfully{\" \"}\n <a\n href={blockExplorer ? `${blockExplorer}/tx/${receipt.data.transactionHash}` : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n deposited\n </a>{\" \"}\n <Balance wei={amount} />\n </>\n );\n })()}\n </DepositStatus>\n );\n}\n","import { PendingIcon } from \"../../icons/PendingIcon\";\nimport { ReactNode, useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CheckIcon } from \"../../icons/CheckIcon\";\nimport { WarningIcon } from \"../../icons/WarningIcon\";\nimport { CloseIcon } from \"../../icons/CloseIcon\";\n\nexport type Props = {\n status: \"pending\" | \"success\" | \"error\";\n progress: {\n duration: number;\n elapsed: number;\n };\n onDismiss: () => void;\n children: ReactNode;\n};\n\nexport function DepositStatus({ status, progress, children, onDismiss }: Props) {\n const [appear, setAppear] = useState(false);\n useEffect(() => {\n setAppear(true);\n }, []);\n\n return (\n <div className=\"group bg-neutral-900 flex flex-col animate-in fade-in slide-in-from-bottom-2 animate-out fade-out\">\n <div className=\"py-1 text-sm flex items-center gap-2\">\n <div className=\"flex-grow\">{children}</div>\n <div className=\"flex-shrink-0 grid\">\n <span className=\"col-start-1 row-start-1 transition opacity-100 group-hover:opacity-0 group-hover:pointer-events-none\">\n {status === \"success\" ? (\n <CheckIcon className=\"text-green-600\" />\n ) : status === \"error\" ? (\n <WarningIcon className=\"text-amber-500\" />\n ) : (\n <PendingIcon className=\"text-neutral-500 transition\" />\n )}\n </span>\n <button\n type=\"button\"\n className={twMerge(\n \"col-start-1 row-start-1 flex items-center justify-center transition\",\n \"opacity-0 pointer-events-none\",\n \"group-hover:opacity-100 group-hover:pointer-events-auto\",\n \"text-neutral-500 hover:text-white\",\n )}\n title=\"Dismiss\"\n onClick={onDismiss}\n >\n <CloseIcon />\n </button>\n </div>\n </div>\n\n <div className=\"w-full h-[2px] -mt-full overflow-clip\">\n <div\n className={twMerge(\n \"w-full h-full transition ease-linear\",\n status === \"success\" ? \"bg-green-600\" : status === \"error\" ? \"bg-red-600\" : \"bg-blue-600\",\n status === \"pending\" ? \"opacity-100\" : \"opacity-0\",\n )}\n style={\n status === \"pending\"\n ? {\n transform: appear ? `translateX(0)` : \"translate(-100%)\",\n transitionDuration: `${progress.duration}ms`,\n transitionDelay: `-${Math.min(progress.duration, progress.elapsed)}ms`,\n }\n : undefined\n }\n />\n </div>\n </div>\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 { useQuery } from \"@tanstack/react-query\";\nimport { DepositStatus } from \"./DepositStatus\";\nimport { useChains } from \"wagmi\";\nimport { RelayDeposit } from \"./useDeposits\";\nimport { Balance } from \"../../ui/Balance\";\n\nexport type Props = RelayDeposit & { onDismiss: () => void };\n\nexport function RelayDepositStatus({\n amount,\n chainL1Id,\n chainL2Id,\n start,\n estimatedTime,\n depositPromise,\n onDismiss,\n}: Props) {\n const chains = useChains();\n const chainL1 = chains.find((chain) => chain.id === chainL1Id)!;\n const chainL2 = chains.find((chain) => chain.id === chainL2Id)!;\n\n const deposit = useQuery({\n queryKey: [\"relayDepositPromise\", chainL1Id, chainL2Id, amount.toString(), start.toISOString()],\n queryFn: () => depositPromise,\n });\n\n return (\n <DepositStatus\n status={deposit.status}\n progress={{\n duration: estimatedTime,\n elapsed: Math.min(estimatedTime, Date.now() - start.getTime()),\n }}\n onDismiss={onDismiss}\n >\n {(() => {\n // const blockExplorerL1 = chainL1.blockExplorers?.default.url;\n // const blockExplorerL2 = chainL2.blockExplorers?.default.url;\n if (deposit.status === \"pending\") {\n // TODO: link to block explorer once we get a tx hash\n return <>Relay bridge deposit pending on {chainL1.name}…</>;\n }\n if (deposit.status === \"error\") {\n return <>Relay bridge deposit to {chainL2.name} failed.</>;\n }\n return (\n <>\n Successfully bridged <Balance wei={amount} /> to {chainL2.name}!\n </>\n );\n })()}\n </DepositStatus>\n );\n}\n","import { IconSVG, Props } from \"./IconSVG\";\n\nexport function ArrowLeftIcon(props: Props) {\n return (\n <IconSVG {...props}>\n <path\n d=\"M19 12H5M12 19l-7-7 7-7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { Address } from \"viem\";\nimport { getAction } from \"viem/utils\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\nimport { useAccount, useClient, useSwitchChain, useWriteContract } from \"wagmi\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPaymaster } from \"../../getPaymaster\";\nimport { paymasterAbi } from \"../../quarry/common\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useBalance } from \"./useBalance\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\n\nexport type Props = {\n userAddress: Address;\n};\n\nexport function WithdrawGasBalanceButton({ userAddress }: Props) {\n const { writeContractAsync } = useWriteContract();\n const { switchChain } = useSwitchChain();\n const { chain, chainId } = useEntryKitConfig();\n const { chainId: userChainId } = useAccount();\n const queryClient = useQueryClient();\n const client = useClient({ chainId });\n const paymaster = getPaymaster(chain);\n const balance = useShowQueryError(useBalance(userAddress));\n const shouldSwitchChain = chainId != null && chainId !== userChainId;\n\n const withdraw = useMutation({\n mutationKey: [\"withdraw\", userAddress],\n mutationFn: async () => {\n if (!client) throw new Error(\"Client not ready.\");\n if (!paymaster) throw new Error(\"Paymaster not found\");\n if (!balance.data) throw new Error(\"No gas balance to withdraw.\");\n\n try {\n const hash = await writeContractAsync({\n address: paymaster.address,\n abi: paymasterAbi,\n functionName: \"withdrawTo\",\n args: [userAddress, balance.data],\n chainId,\n });\n await getAction(client, waitForTransactionReceipt, \"waitForTransactionReceipt\")({ hash });\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"balance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n } catch (error) {\n console.error(\"Error while withdrawing\", error);\n throw error;\n }\n },\n });\n\n if (balance.data == null || balance.data === 0n) {\n return null;\n }\n\n return (\n <button\n onClick={() => {\n if (shouldSwitchChain) {\n return switchChain({ chainId });\n }\n withdraw.mutate();\n }}\n className={twMerge(\n \"text-sm font-medium text-white/50 group whitespace-nowrap\",\n withdraw.isPending ? \"opacity-50 pointer-events-none\" : \"cursor-pointer hover:text-white\",\n )}\n disabled={withdraw.isPending}\n >\n <span className=\"inline-block\">\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 underline decoration-neutral-500 underline-offset-4\",\n !withdraw.isPending && \"hover:decoration-orange-500\",\n shouldSwitchChain && \"group-hover:hidden\",\n )}\n >\n {withdraw.isPending && <PendingIcon className=\"w-3 h-3\" />}\n Withdraw\n </span>\n\n {shouldSwitchChain && (\n <span className=\"hidden group-hover:inline-block underline decoration-neutral-500 underline-offset-4 hover:decoration-orange-500\">\n Switch chain\n </span>\n )}\n </span>\n </button>\n );\n}\n","import { wait } from \"@latticexyz/common/utils\";\nimport { useEffect } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n error?: Error;\n dismiss?: () => unknown;\n retry?: () => unknown | Promise<unknown>;\n};\n\nexport function ErrorOverlay({ error, retry, dismiss }: Props) {\n useEffect(() => {\n if (error) {\n console.error(error);\n }\n }, [error]);\n\n return (\n <div className=\"pointer-events-none absolute inset-0 overflow-clip\">\n <div\n className={twMerge(\n \"absolute inset-0 bg-blue-700/60\",\n \"transition duration-300\",\n error ? \"opacity-100 pointer-events-auto\" : \"opacity-0\",\n )}\n />\n <div\n className={twMerge(\n \"absolute inset-0 pb-8\",\n \"transition duration-300\",\n error ? \"translate-y-0 opacity-100 pointer-events-auto\" : \"-translate-y-4 opacity-0\",\n )}\n >\n {error ? (\n <>\n <div className=\"w-full max-h-full bg-blue-700 text-white/80 overflow-auto\">\n <div className=\"space-y-6 px-8 pt-8\">\n <div className=\"text-white text-lg font-bold\">Oops! It broke :(</div>\n <div className=\"font-mono text-xs whitespace-pre-wrap\">{error.message.trim()}</div>\n <div className=\"text-sm\">See the console for more info.</div>\n </div>\n <div className=\"pointer-events-none sticky bottom-0 left-0 -mt-2\">\n <div className=\"w-full h-12 bg-gradient-to-b from-transparent to-blue-700\" />\n {retry ? (\n <div className=\"bg-blue-700 text-center\">\n {/* TODO: replace with AsyncButton */}\n <button\n type=\"button\"\n className={twMerge(\n \"pointer-events-auto group w-24 p-1 -translate-y-2 transition\",\n \"bg-blue-600 hover:bg-blue-500 aria-busy:bg-blue-500\",\n \"text-white text-sm font-medium\",\n \"aria-busy:pointer-events-none\",\n )}\n onClick={async (event) => {\n // if we retry and the same error occurs, it'll look like the button click did nothing\n // so we'll fake a pending state here to give users an indication something is happening\n event.currentTarget.ariaBusy = \"true\";\n await wait(500);\n retry();\n if (event.currentTarget) {\n event.currentTarget.ariaBusy = null;\n }\n }}\n >\n {/* TODO: swap with pending icon */}\n <span className=\"group-aria-busy:hidden\">Retry</span>\n <span className=\"hidden group-aria-busy:inline\">Retrying…</span>\n </button>\n </div>\n ) : dismiss ? (\n <div className=\"bg-blue-700 text-center\">\n {/* TODO: replace with AsyncButton */}\n <button\n type=\"button\"\n className={twMerge(\n \"pointer-events-auto group w-24 p-1 -translate-y-2 transition\",\n \"bg-blue-600 hover:bg-blue-500 aria-busy:bg-blue-500\",\n \"text-white text-sm font-medium\",\n \"aria-busy:pointer-events-none\",\n )}\n onClick={dismiss}\n >\n Dismiss\n </button>\n </div>\n ) : null}\n </div>\n </div>\n </>\n ) : null}\n </div>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { FallbackProps } from \"react-error-boundary\";\nimport { ErrorOverlay } from \"./ErrorOverlay\";\n\nexport type Props = {\n children: ReactNode;\n};\n\nexport function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {\n return (\n <div className=\"h-64\">\n <ErrorOverlay error={error} retry={resetErrorBoundary} />\n </div>\n );\n}\n","import { useStore } from \"zustand\";\nimport { store } from \"./store\";\nimport { ErrorOverlay } from \"./ErrorOverlay\";\n\nexport function ErrorsOverlay() {\n const error = useStore(store, (state) => state.errors.at(0));\n return <ErrorOverlay error={error?.error} retry={error?.retry} dismiss={error?.dismiss} />;\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 || prereqs.isPending}\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 (!prerequisites.isSuccess || !prerequisites.data.complete) {\n return { ...prerequisites, data: undefined } as never;\n }\n\n return sessionClient;\n}\n","import { Chain, Transport } from \"viem\";\nimport { Config, CreateConfigParameters, CreateConnectorFn, createConfig } from \"wagmi\";\nimport { getDefaultConfig } from \"connectkit\";\nimport { getDefaultConnectors } from \"./getDefaultConnectors\";\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 connectorFns extends readonly CreateConnectorFn[] = readonly CreateConnectorFn[],\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, connectorFns>, \"pollingInterval\" | \"connectors\">;\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n const connectorFns extends readonly CreateConnectorFn[] = readonly CreateConnectorFn[],\n>(config: CreateWagmiConfigOptions<chains, transports, connectorFns>): Config<chains, transports, connectorFns> {\n const connectors = config.connectors ?? getDefaultConnectors(config);\n\n const configParams = getDefaultConfig({\n chains: config.chains,\n transports: config.transports,\n pollingInterval: config.pollingInterval,\n appName: config.appName,\n walletConnectProjectId: config.walletConnectProjectId,\n enableFamily: false,\n connectors,\n });\n\n return createConfig(configParams) as never;\n}\n","import { CreateConnectorFn } from \"wagmi\";\nimport { injected, coinbaseWallet, safe } from \"wagmi/connectors\";\nimport { walletConnect } from \"./connectors/walletConnect\";\n\nexport type GetDefaultConnectorsOptions = {\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};\n\nexport function getDefaultConnectors(config: GetDefaultConnectorsOptions): readonly CreateConnectorFn[] {\n // TODO: return ConnectKit's default connectors once https://github.com/wevm/wagmi/pull/4691 lands\n const connectors: CreateConnectorFn[] = [];\n\n // If we're in an iframe, include the SafeConnector\n const shouldUseSafeConnector = !(typeof window === \"undefined\") && window?.parent !== window;\n if (shouldUseSafeConnector) {\n connectors.push(\n safe({\n allowedDomains: [/gnosis-safe.io$/, /app.safe.global$/],\n }),\n );\n }\n\n connectors.push(\n injected({ target: \"metaMask\" }),\n coinbaseWallet({\n appName: config.appName,\n overrideIsMetaMask: false,\n }),\n );\n\n if (config.walletConnectProjectId) {\n connectors.push(\n walletConnect({\n showQrModal: false,\n projectId: config.walletConnectProjectId,\n }),\n );\n }\n\n return connectors;\n}\n","import { ChainNotConfiguredError, type Connector, ProviderNotFoundError, createConnector } from \"wagmi\";\nimport type { Chain, Transport } from \"viem\";\nimport type { EthereumProvider } from \"@walletconnect/ethereum-provider\";\nimport {\n type AddEthereumChainParameter,\n type Address,\n type ProviderConnectInfo,\n type ProviderRpcError,\n type RpcError,\n SwitchChainError,\n UserRejectedRequestError,\n getAddress,\n numberToHex,\n} from \"viem\";\n\n// This is a fork of wagmi's WalletConnect connector and adjusts when the `switchChain` call is made\n// TODO: remove once https://github.com/wevm/wagmi/pull/4691 lands\n\ntype WalletConnectConnector = Connector & {\n onDisplayUri(uri: string): void;\n onSessionDelete(data: { topic: string }): void;\n};\n\ntype EthereumProviderOptions = Parameters<(typeof EthereumProvider)[\"init\"]>[0];\n\n// TODO: export from wagmi?\ntype Compute<type> = { [key in keyof type]: type[key] } & unknown;\ntype ExactPartial<type> = { [key in keyof type]?: type[key] | undefined };\ntype StrictOmit<type, keys extends keyof type> = Pick<type, Exclude<keyof type, keys>>;\n\nexport type WalletConnectParameters = Compute<\n {\n /**\n * If a new chain is added to a previously existing configured connector `chains`, this flag\n * will determine if that chain should be considered as stale. A stale chain is a chain that\n * WalletConnect has yet to establish a relationship with (e.g. the user has not approved or\n * rejected the chain).\n *\n * This flag mainly affects the behavior when a wallet does not support dynamic chain authorization\n * with WalletConnect v2.\n *\n * If `true` (default), the new chain will be treated as a stale chain. If the user\n * has yet to establish a relationship (approved/rejected) with this chain in their WalletConnect\n * session, the connector will disconnect upon the dapp auto-connecting, and the user will have to\n * reconnect to the dapp (revalidate the chain) in order to approve the newly added chain.\n * This is the default behavior to avoid an unexpected error upon switching chains which may\n * be a confusing user experience (e.g. the user will not know they have to reconnect\n * unless the dapp handles these types of errors).\n *\n * If `false`, the new chain will be treated as a potentially valid chain. This means that if the user\n * has yet to establish a relationship with the chain in their WalletConnect session, wagmi will successfully\n * auto-connect the user. This comes with the trade-off that the connector will throw an error\n * when attempting to switch to the unapproved chain if the wallet does not support dynamic session updates.\n * This may be useful in cases where a dapp constantly\n * modifies their configured chains, and they do not want to disconnect the user upon\n * auto-connecting. If the user decides to switch to the unapproved chain, it is important that the\n * dapp handles this error and prompts the user to reconnect to the dapp in order to approve\n * the newly added chain.\n *\n * @default true\n */\n isNewChainsStale?: boolean;\n } & StrictOmit<\n EthereumProviderOptions,\n \"chains\" | \"events\" | \"optionalChains\" | \"optionalEvents\" | \"optionalMethods\" | \"methods\" | \"rpcMap\" | \"showQrModal\"\n > &\n ExactPartial<Pick<EthereumProviderOptions, \"showQrModal\">>\n>;\n\nwalletConnect.type = \"walletConnect\" as const;\nexport function walletConnect(parameters: WalletConnectParameters) {\n const isNewChainsStale = parameters.isNewChainsStale ?? true;\n\n type Provider = Awaited<ReturnType<(typeof EthereumProvider)[\"init\"]>>;\n type Properties = {\n connect(parameters?: {\n chainId?: number | undefined;\n isReconnecting?: boolean | undefined;\n pairingTopic?: string | undefined;\n }): Promise<{\n accounts: readonly Address[];\n chainId: number;\n }>;\n getNamespaceChainsIds(): number[];\n getRequestedChainsIds(): Promise<number[]>;\n isChainsStale(): Promise<boolean>;\n onConnect(connectInfo: ProviderConnectInfo): void;\n onDisplayUri(uri: string): void;\n onSessionDelete(data: { topic: string }): void;\n setRequestedChainsIds(chains: number[]): void;\n requestedChainsStorageKey: `${string}.requestedChains`;\n };\n type StorageItem = {\n [_ in Properties[\"requestedChainsStorageKey\"]]: number[];\n };\n\n let provider_: Provider | undefined;\n let providerPromise: Promise<typeof provider_>;\n const NAMESPACE = \"eip155\";\n\n let accountsChanged: WalletConnectConnector[\"onAccountsChanged\"] | undefined;\n let chainChanged: WalletConnectConnector[\"onChainChanged\"] | undefined;\n let connect: WalletConnectConnector[\"onConnect\"] | undefined;\n let displayUri: WalletConnectConnector[\"onDisplayUri\"] | undefined;\n let sessionDelete: WalletConnectConnector[\"onSessionDelete\"] | undefined;\n let disconnect: WalletConnectConnector[\"onDisconnect\"] | undefined;\n\n return createConnector<Provider, Properties, StorageItem>((config) => ({\n id: \"walletConnect\",\n name: \"WalletConnect\",\n type: walletConnect.type,\n async setup() {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return;\n if (!connect) {\n connect = this.onConnect.bind(this);\n provider.on(\"connect\", connect);\n }\n if (!sessionDelete) {\n sessionDelete = this.onSessionDelete.bind(this);\n provider.on(\"session_delete\", sessionDelete);\n }\n },\n async connect({ chainId, ...rest } = {}) {\n try {\n const provider = await this.getProvider();\n if (!provider) throw new ProviderNotFoundError();\n if (!displayUri) {\n displayUri = this.onDisplayUri;\n provider.on(\"display_uri\", displayUri);\n }\n\n let targetChainId = chainId;\n if (!targetChainId) {\n const state = (await config.storage?.getItem(\"state\")) ?? {};\n const isChainSupported = config.chains.some((x) => x.id === state.chainId);\n if (isChainSupported) targetChainId = state.chainId;\n else targetChainId = config.chains[0]?.id;\n }\n if (!targetChainId) throw new Error(\"No chains found on connector.\");\n\n const isChainsStale = await this.isChainsStale();\n // If there is an active session with stale chains, disconnect current session.\n if (provider.session && isChainsStale) await provider.disconnect();\n\n // If there isn't an active session or chains are stale, connect.\n if (!provider.session || isChainsStale) {\n const optionalChains = config.chains\n .filter((chain) => chain.id !== targetChainId)\n .map((optionalChain) => optionalChain.id);\n await provider.connect({\n optionalChains: [targetChainId, ...optionalChains],\n ...(\"pairingTopic\" in rest ? { pairingTopic: rest.pairingTopic } : {}),\n });\n\n this.setRequestedChainsIds(config.chains.map((x) => x.id));\n }\n\n // If session exists and chains are authorized, enable provider for required chain\n const accounts = (await provider.enable()).map((x) => getAddress(x));\n\n // Switch to chain if provided\n let currentChainId = await this.getChainId();\n if (chainId && currentChainId !== chainId) {\n const chain = await this.switchChain!({ chainId }).catch((error) => {\n if (error.code === UserRejectedRequestError.code) throw error;\n return { id: currentChainId };\n });\n currentChainId = chain?.id ?? currentChainId;\n }\n\n if (displayUri) {\n provider.removeListener(\"display_uri\", displayUri);\n displayUri = undefined;\n }\n if (connect) {\n provider.removeListener(\"connect\", connect);\n connect = undefined;\n }\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n provider.on(\"accountsChanged\", accountsChanged);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n provider.on(\"chainChanged\", chainChanged);\n }\n if (!disconnect) {\n disconnect = this.onDisconnect.bind(this);\n provider.on(\"disconnect\", disconnect);\n }\n if (!sessionDelete) {\n sessionDelete = this.onSessionDelete.bind(this);\n provider.on(\"session_delete\", sessionDelete);\n }\n\n return { accounts, chainId: currentChainId };\n } catch (error) {\n if (/(user rejected|connection request reset)/i.test((error as ProviderRpcError)?.message)) {\n throw new UserRejectedRequestError(error as Error);\n }\n throw error;\n }\n },\n async disconnect() {\n const provider = await this.getProvider();\n try {\n await provider?.disconnect();\n } catch (error) {\n if (!/No matching key/i.test((error as Error).message)) throw error;\n } finally {\n if (chainChanged) {\n provider?.removeListener(\"chainChanged\", chainChanged);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider?.removeListener(\"disconnect\", disconnect);\n disconnect = undefined;\n }\n if (!connect) {\n connect = this.onConnect.bind(this);\n provider?.on(\"connect\", connect);\n }\n if (accountsChanged) {\n provider?.removeListener(\"accountsChanged\", accountsChanged);\n accountsChanged = undefined;\n }\n if (sessionDelete) {\n provider?.removeListener(\"session_delete\", sessionDelete);\n sessionDelete = undefined;\n }\n\n this.setRequestedChainsIds([]);\n }\n },\n async getAccounts() {\n const provider = await this.getProvider();\n return provider.accounts.map((x) => getAddress(x));\n },\n async getProvider() {\n async function initProvider() {\n const optionalChains = config.chains.map((x) => x.id) as [number];\n if (!optionalChains.length) return;\n const { EthereumProvider } = await import(\"@walletconnect/ethereum-provider\");\n return await EthereumProvider.init({\n ...parameters,\n disableProviderPing: true,\n optionalChains,\n projectId: parameters.projectId,\n rpcMap: Object.fromEntries(\n config.chains.map((chain) => {\n const [url] = extractRpcUrls({\n chain,\n transports: config.transports,\n });\n return [chain.id, url];\n }),\n ),\n showQrModal: parameters.showQrModal ?? true,\n });\n }\n\n if (!provider_) {\n if (!providerPromise) providerPromise = initProvider();\n provider_ = await providerPromise;\n provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY);\n }\n return provider_!;\n },\n async getChainId() {\n const provider = await this.getProvider();\n return provider.chainId;\n },\n async isAuthorized() {\n try {\n const [accounts, provider] = await Promise.all([this.getAccounts(), this.getProvider()]);\n\n // If an account does not exist on the session, then the connector is unauthorized.\n if (!accounts.length) return false;\n\n // If the chains are stale on the session, then the connector is unauthorized.\n const isChainsStale = await this.isChainsStale();\n if (isChainsStale && provider.session) {\n await provider.disconnect().catch(() => {});\n return false;\n }\n return true;\n } catch {\n return false;\n }\n },\n async switchChain({ addEthereumChainParameter, chainId }) {\n const provider = await this.getProvider();\n if (!provider) throw new ProviderNotFoundError();\n\n const chain = config.chains.find((x) => x.id === chainId);\n if (!chain) throw new SwitchChainError(new ChainNotConfiguredError());\n\n try {\n await Promise.all([\n new Promise<void>((resolve) => {\n const listener = ({ chainId: currentChainId }: { chainId?: number | undefined }) => {\n if (currentChainId === chainId) {\n config.emitter.off(\"change\", listener);\n resolve();\n }\n };\n config.emitter.on(\"change\", listener);\n }),\n provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n }),\n ]);\n\n const requestedChains = await this.getRequestedChainsIds();\n this.setRequestedChainsIds([...requestedChains, chainId]);\n\n return chain;\n } catch (err) {\n const error = err as RpcError;\n\n if (/(user rejected)/i.test(error.message)) throw new UserRejectedRequestError(error);\n\n // Indicates chain is not added to provider\n try {\n let blockExplorerUrls: string[] | undefined;\n if (addEthereumChainParameter?.blockExplorerUrls)\n blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls;\n else blockExplorerUrls = chain.blockExplorers?.default.url ? [chain.blockExplorers?.default.url] : [];\n\n let rpcUrls: readonly string[];\n if (addEthereumChainParameter?.rpcUrls?.length) rpcUrls = addEthereumChainParameter.rpcUrls;\n else rpcUrls = [...chain.rpcUrls.default.http];\n\n const addEthereumChain = {\n blockExplorerUrls,\n chainId: numberToHex(chainId),\n chainName: addEthereumChainParameter?.chainName ?? chain.name,\n iconUrls: addEthereumChainParameter?.iconUrls,\n nativeCurrency: addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,\n rpcUrls,\n } satisfies AddEthereumChainParameter;\n\n await provider.request({\n method: \"wallet_addEthereumChain\",\n params: [addEthereumChain],\n });\n\n const requestedChains = await this.getRequestedChainsIds();\n this.setRequestedChainsIds([...requestedChains, chainId]);\n return chain;\n } catch (error) {\n throw new UserRejectedRequestError(error as Error);\n }\n }\n },\n onAccountsChanged(accounts) {\n if (accounts.length === 0) this.onDisconnect();\n else\n config.emitter.emit(\"change\", {\n accounts: accounts.map((x) => getAddress(x)),\n });\n },\n onChainChanged(chain) {\n const chainId = Number(chain);\n config.emitter.emit(\"change\", { chainId });\n },\n async onConnect(connectInfo) {\n const chainId = Number(connectInfo.chainId);\n const accounts = await this.getAccounts();\n config.emitter.emit(\"connect\", { accounts, chainId });\n },\n async onDisconnect(_error) {\n this.setRequestedChainsIds([]);\n config.emitter.emit(\"disconnect\");\n\n const provider = await this.getProvider();\n if (accountsChanged) {\n provider.removeListener(\"accountsChanged\", accountsChanged);\n accountsChanged = undefined;\n }\n if (chainChanged) {\n provider.removeListener(\"chainChanged\", chainChanged);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider.removeListener(\"disconnect\", disconnect);\n disconnect = undefined;\n }\n if (sessionDelete) {\n provider.removeListener(\"session_delete\", sessionDelete);\n sessionDelete = undefined;\n }\n if (!connect) {\n connect = this.onConnect.bind(this);\n provider.on(\"connect\", connect);\n }\n },\n onDisplayUri(uri) {\n config.emitter.emit(\"message\", { type: \"display_uri\", data: uri });\n },\n onSessionDelete() {\n this.onDisconnect();\n },\n getNamespaceChainsIds() {\n if (!provider_) return [];\n const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map((account) =>\n Number.parseInt(account.split(\":\")[1] || \"\"),\n );\n return chainIds ?? [];\n },\n async getRequestedChainsIds() {\n return (await config.storage?.getItem(this.requestedChainsStorageKey)) ?? [];\n },\n /**\n * Checks if the target chains match the chains that were\n * initially requested by the connector for the WalletConnect session.\n * If there is a mismatch, this means that the chains on the connector\n * are considered stale, and need to be revalidated at a later point (via\n * connection).\n *\n * There may be a scenario where a dapp adds a chain to the\n * connector later on, however, this chain will not have been approved or rejected\n * by the wallet. In this case, the chain is considered stale.\n */\n async isChainsStale() {\n if (!isNewChainsStale) return false;\n\n const connectorChains = config.chains.map((x) => x.id);\n const namespaceChains = this.getNamespaceChainsIds();\n if (namespaceChains.length && !namespaceChains.some((id) => connectorChains.includes(id))) return false;\n\n const requestedChains = await this.getRequestedChainsIds();\n return !connectorChains.every((id) => requestedChains.includes(id));\n },\n async setRequestedChainsIds(chains) {\n await config.storage?.setItem(this.requestedChainsStorageKey, chains);\n },\n get requestedChainsStorageKey() {\n return `${this.id}.requestedChains` as Properties[\"requestedChainsStorageKey\"];\n },\n }));\n}\n\ntype ExtractRpcUrlsParameters = {\n transports?: Record<string, Transport> | undefined;\n chain: Chain;\n};\n\nexport function extractRpcUrls(parameters: ExtractRpcUrlsParameters) {\n const { chain } = parameters;\n const fallbackUrl = chain.rpcUrls.default.http[0];\n\n if (!parameters.transports) return [fallbackUrl];\n\n const transport = parameters.transports?.[chain.id]?.({ chain });\n const transports = (transport?.value?.transports as NonNullable<typeof transport>[]) || [transport];\n return transports.map(({ value }) => value?.url || fallbackUrl);\n}\n","import { Chain, createClient, http } from \"viem\";\nimport { cachedFeesPerGas } from \"../actions/cachedFeesPerGas\";\n\ntype WithFeeCacheOptions = {\n refreshInterval?: number;\n};\n\nexport function withFeeCache<chain extends Chain>(\n chain: chain,\n options: WithFeeCacheOptions = { refreshInterval: 10_000 },\n): chain {\n if (chain.fees?.estimateFeesPerGas) {\n throw new Error(\"withFeeCache: estimateFeesPerGas already defined in chain config\");\n }\n\n const client = createClient({\n chain,\n transport: http(),\n });\n\n return {\n ...chain,\n fees: {\n ...chain.fees,\n estimateFeesPerGas: cachedFeesPerGas(client, options),\n },\n };\n}\n","import { Address, Client } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { getDelegation } from \"./onboarding/getDelegation\";\n\n/**\n * @internal\n */\nexport async function internal_validateSigner({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n signerAddress,\n}: {\n client: Client;\n worldAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n signerAddress: Address;\n}) {\n const ownerAddress = await readContract(client, {\n address: sessionAddress,\n abi: simpleAccountAbi,\n functionName: \"owner\",\n });\n\n if (ownerAddress.toLowerCase() !== signerAddress.toLowerCase()) {\n throw new Error(`Session account owner (${ownerAddress}) does not match message signer (${signerAddress}).`);\n }\n\n const hasDelegation = await getDelegation({\n client,\n worldAddress,\n sessionAddress,\n userAddress,\n blockTag: \"latest\",\n });\n\n if (!hasDelegation) {\n throw new Error(`Session account (${sessionAddress}) does not have delegation for user account (${userAddress}).`);\n }\n}\n\n// TODO: import ABI once we can get strongly typed JSON or expose `getOwner` or similar method on smart account\nconst simpleAccountAbi = [\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n"],"mappings":"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AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;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","names":["useEffect","createContext","useContext","entryPoint07Address","debug","debug","entryPoint07Address","log","jsx","Context","createContext","useContext","jsx","Shadow","jsx","jsxs","useEffect","twMerge","useAccount","twMerge","twMerge","jsx","jsxs","jsx","jsxs","twMerge","twMerge","jsx","jsxs","jsx","jsxs","twMerge","useEffect","useRef","jsx","jsxs","error","useEffect","useMemo","useRef","useState","twMerge","useClient","useConfig","queryOptions","useQuery","useQueryClient","useQuery","useClient","queryOptions","skipToken","useQuery","getRecord","parseAbi","getRecord","queryOptions","skipToken","useClient","queryOptions","skipToken","useQuery","createStore","store","privateKeyToAccount","store","queryOptions","skipToken","useClient","getBalanceQueryOptions","queryOptions","useQuery","useClient","queryOptions","skipToken","useQuery","getAction","getAction","queryOptions","skipToken","useClient","useQuery","useClient","queryOptions","skipToken","useQuery","getRecord","getRecord","queryOptions","skipToken","useClient","useQuery","queryOptions","getBalanceQueryOptions","useClient","useQuery","queryOptions","useQueryClient","useConfig","useClient","useQuery","useQuery","jsx","jsxs","createStore","store","error","useEffect","error","jsx","jsxs","parseEther","useQueryClient","http","debug","useQueryClient","twMerge","jsx","jsxs","formatEther","jsx","jsxs","useEffect","useEffect","error","jsx","jsxs","requestAllowance","useEffect","parseEther","useEffect","parseEventLogs","useMutation","useQueryClient","getAction","entryPoint07Abi","sendUserOperation","waitForTransactionReceipt","useClient","resourceToHex","getAction","getRecord","getAction","getAction","isIdPlaceConnector","useQueryClient","useClient","useMutation","getAction","parseEventLogs","entryPoint07Abi","sendUserOperation","resourceToHex","waitForTransactionReceipt","useClient","queryOptions","useQuery","useQueryClient","queryOptions","useQueryClient","useClient","useQuery","jsx","jsxs","useEffect","useEffect","useState","parseEther","useQueryClient","useBalance","useQueryClient","useMutation","setBalance","useClient","useQueryClient","useClient","useMutation","setBalance","useEffect","useRef","twMerge","jsx","jsx","jsx","Fragment","jsx","jsxs","useQueryClient","useState","useBalance","setBalance","useEffect","parseEther","useEffect","useQueryClient","useState","useChains","useAccount","encodeFunctionData","useMutation","useQuery","useEffect","useRef","useAccount","useBalance","useWatchBlockNumber","twMerge","useEffect","useMemo","twMerge","jsx","jsx","twMerge","twMerge","jsx","twMerge","twMerge","jsx","fallback","forwardRef","jsx","ChainIcon","twMerge","createClient","useQuery","useQuery","createClient","getBalance","useQuery","skipToken","Fragment","jsx","jsxs","useMemo","useEffect","value","twMerge","formatEther","parseEther","twMerge","forwardRef","jsx","jsxs","forwardRef","AmountInput","twMerge","formatEther","parseEther","useAccount","useBalance","useSwitchChain","twMerge","parseEther","jsx","jsxs","useAccount","useBalance","useSwitchChain","jsx","Fragment","jsx","jsxs","useRef","useAccount","useBalance","useWatchBlockNumber","useEffect","jsxs","error","jsx","twMerge","Fragment","createStore","useStore","useCallback","useMemo","store","jsx","useAccount","useQuery","encodeFunctionData","useMutation","receipt","error","encodeFunctionData","useAccount","useMutation","useQuery","jsx","useAccount","useQuery","encodeFunctionData","useMutation","quote","amount","error","useEffect","useQuery","useQueryClient","useQuery","useEffect","useState","twMerge","jsx","jsx","jsxs","useState","useEffect","twMerge","useChains","Fragment","jsx","jsxs","useChains","chain","useQuery","useQuery","useChains","Fragment","jsx","jsxs","useChains","useQuery","useAccount","useClient","jsx","useQueryClient","useClient","useAccount","useQuery","useEffect","jsx","jsxs","useChains","useState","jsx","getAction","waitForTransactionReceipt","useAccount","useClient","useSwitchChain","useWriteContract","twMerge","useMutation","useQueryClient","jsx","jsxs","useWriteContract","useSwitchChain","useAccount","useQueryClient","useClient","useMutation","getAction","waitForTransactionReceipt","error","twMerge","jsx","jsxs","GasBalance","useQueryClient","useEffect","jsx","useState","useEffect","useRef","useMemo","steps","GasBalance","twMerge","useRef","jsx","useAccount","useEffect","twMerge","Fragment","jsx","jsxs","error","jsx","error","useStore","jsx","error","useStore","store","jsx","jsxs","twMerge","jsx","jsxs","useAccount","twMerge","twMerge","Fragment","jsx","jsxs","useRef","jsx","jsxs","twMerge","AccountButton","useAccount","useConnectorClient","useConnectorClient","numberToHex","error","listener","createClient","http","createClient","http","readContract","readContract"]}
1
+ {"version":3,"sources":["../../../src/config/defineConfig.ts","../../../src/ui/Modal.tsx","../../../src/ui/Shadow.tsx","../../../../../node_modules/.pnpm/tailwindcss@3.4.13/node_modules/tailwindcss/tailwind.css","../../../src/ui/FrameProvider.tsx","../../../src/useTheme.ts","../../../src/EntryKitConfigProvider.tsx","../../../src/getBundlerTransport.ts","../../../src/quarry/transports/userOpExecutor.ts","../../../src/quarry/transports/methods/estimateUserOperationGas.ts","../../../src/quarry/transports/methods/sendUserOperation.ts","../../../src/debug.ts","../../../src/quarry/debug.ts","../../../src/useAccountModal.ts","../../../src/AccountModal.tsx","../../../src/AccountModalContent.tsx","../../../src/ui/Button.tsx","../../../src/icons/PendingIcon.tsx","../../../src/ConnectWallet.tsx","../../../src/icons/Logo.tsx","../../../src/usePreloadImage.tsx","../../../src/AppInfo.tsx","../../../src/onboarding/ConnectedSteps.tsx","../../../src/onboarding/usePrerequisites.ts","../../../src/onboarding/quarry/useSpender.ts","../../../src/quarry/common.ts","../../../src/onboarding/quarry/getSpender.ts","../../../src/getPaymaster.ts","../../../src/onboarding/useDelegation.ts","../../../src/onboarding/getDelegation.ts","../../../src/common.ts","../../../src/useSessionAccount.ts","../../../src/getSessionAccount.ts","../../../src/getSessionSigner.ts","../../../src/store.ts","../../../src/useFunds.ts","../../../src/onboarding/quarry/useAllowance.ts","../../../src/quarry/getAllowance.ts","../../../src/onboarding/quarry/useBalance.ts","../../../src/quarry/getBalance.ts","../../../src/onboarding/Wallet.tsx","../../../src/useENS.ts","../../../src/ui/TruncatedHex.tsx","../../../src/errors/store.ts","../../../src/errors/useShowMutationError.ts","../../../src/onboarding/Session.tsx","../../../src/onboarding/useSetupSession.ts","../../../src/utils/defineCall.ts","../../../src/utils/callWithSignature.ts","../../../src/utils/signCall.ts","../../../src/createBundlerClient.ts","../../../src/actions/cachedFeesPerGas.ts","../../../src/useSessionClient.ts","../../../src/getSessionClient.ts","../../../src/errors/useShowQueryError.ts","../../../src/onboarding/GasBalance.tsx","../../../src/icons/EthIcon.tsx","../../../src/formatBalance.ts","../../../src/ui/Balance.tsx","../../../src/data/relayChains.json","../../../src/onboarding/useSetBalance.ts","../../../src/errors/usePrevious.ts","../../../src/icons/IconSVG.tsx","../../../src/icons/CopyIcon.tsx","../../../src/icons/CheckIcon.tsx","../../../src/onboarding/quarry/GasBalance.tsx","../../../src/onboarding/deposit/DepositFormContainer.tsx","../../../src/onboarding/deposit/DepositViaTransferForm.tsx","../../../src/onboarding/deposit/DepositForm.tsx","../../../src/onboarding/deposit/ChainSelect.tsx","../../../src/icons/ChevronUpIcon.tsx","../../../src/icons/ChevronDownIcon.tsx","../../../src/ui/Slot.tsx","../../../src/ui/Input.tsx","../../../src/onboarding/deposit/ChainIcon.tsx","../../../src/onboarding/deposit/PreloadedImage.tsx","../../../src/onboarding/deposit/useRelay.ts","../../../src/onboarding/deposit/useChainBalances.ts","../../../src/onboarding/deposit/AmountInput.tsx","../../../src/onboarding/deposit/SubmitButton.tsx","../../../src/icons/WarningIcon.tsx","../../../src/formatGas.ts","../../../src/onboarding/deposit/useDeposits.ts","../../../src/onboarding/deposit/DepositViaRelayForm.tsx","../../../src/onboarding/deposit/Deposits.tsx","../../../src/onboarding/deposit/TransferDepositStatus.tsx","../../../src/onboarding/deposit/DepositStatus.tsx","../../../src/icons/CloseIcon.tsx","../../../src/onboarding/deposit/RelayDepositStatus.tsx","../../../src/icons/ArrowLeftIcon.tsx","../../../src/onboarding/quarry/WithdrawGasBalanceButton.tsx","../../../src/onboarding/quarry/useRequestAllowance.ts","../../../src/quarry/transports/quarrySponsor.ts","../../../src/quarry/requestAllowance.ts","../../../src/errors/ErrorOverlay.tsx","../../../src/errors/ErrorFallback.tsx","../../../src/errors/ErrorsOverlay.tsx","../../../src/EntryKitProvider.tsx","../../../src/AccountButton.tsx","../../../src/AccountName.tsx","../../../src/useSessionClientReady.ts","../../../src/createWagmiConfig.ts","../../../src/getDefaultConnectors.ts","../../../src/connectors/walletConnect.ts","../../../src/utils/withFeeCache.ts","../../../src/validateSigner.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, useEffect } from \"react\";\nimport {\n Root as DialogRoot,\n DialogPortal,\n DialogContent,\n DialogTitle,\n DialogDescription,\n} 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 // Focus trapping doesn't seem to completely work with our iframe approach,\n // so tabbing until you get to the document body means Escape doesn't work.\n // We'll patch this behavior for now with our own listener.\n useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented) return;\n\n if (event.key === \"Escape\" && open) {\n event.preventDefault();\n onOpenChange?.(false);\n }\n }\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [onOpenChange, open]);\n\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 className=\"outline-none w-full max-w-[26rem] mx-auto\">\n <DialogTitle className=\"sr-only\">EntryKit</DialogTitle>\n <DialogDescription className=\"sr-only\">Sign in to this app</DialogDescription>\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 // one less than ConnectKit's modal z-index\n // so that ConnectKit can overlap properly\n zIndex: \"2147483645\",\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","*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}/*\n! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */ /* 3 */\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n\n .container {\n max-width: 1536px;\n }\n}\n\n.grid-cols-2.divide-y > :not([hidden]) ~ :not([hidden]):nth-child(-n + 2) {\n border-top-width: 0;\n border-bottom-width: 0;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.pointer-events-none {\n pointer-events: none;\n}\n\n.pointer-events-auto {\n pointer-events: auto;\n}\n\n.fixed {\n position: fixed;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.sticky {\n position: sticky;\n}\n\n.inset-0 {\n inset: 0px;\n}\n\n.bottom-0 {\n bottom: 0px;\n}\n\n.left-0 {\n left: 0px;\n}\n\n.right-0 {\n right: 0px;\n}\n\n.top-0 {\n top: 0px;\n}\n\n.col-start-1 {\n grid-column-start: 1;\n}\n\n.row-start-1 {\n grid-row-start: 1;\n}\n\n.m-0 {\n margin: 0px;\n}\n\n.m-2 {\n margin: 0.5rem;\n}\n\n.-mx-0\\.5 {\n margin-left: -0.125rem;\n margin-right: -0.125rem;\n}\n\n.-my-1 {\n margin-top: -0.25rem;\n margin-bottom: -0.25rem;\n}\n\n.-my-\\[0\\.125em\\] {\n margin-top: -0.125em;\n margin-bottom: -0.125em;\n}\n\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n\n.-ml-3 {\n margin-left: -0.75rem;\n}\n\n.-mr-1 {\n margin-right: -0.25rem;\n}\n\n.-mt-2 {\n margin-top: -0.5rem;\n}\n\n.mt-1 {\n margin-top: 0.25rem;\n}\n\n.mt-4 {\n margin-top: 1rem;\n}\n\n.block {\n display: block;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: flex;\n}\n\n.inline-flex {\n display: inline-flex;\n}\n\n.table {\n display: table;\n}\n\n.grid {\n display: grid;\n}\n\n.inline-grid {\n display: inline-grid;\n}\n\n.contents {\n display: contents;\n}\n\n.hidden {\n display: none;\n}\n\n.aspect-square {\n aspect-ratio: 1 / 1;\n}\n\n.h-10 {\n height: 2.5rem;\n}\n\n.h-12 {\n height: 3rem;\n}\n\n.h-16 {\n height: 4rem;\n}\n\n.h-3 {\n height: 0.75rem;\n}\n\n.h-3\\.5 {\n height: 0.875rem;\n}\n\n.h-4 {\n height: 1rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-64 {\n height: 16rem;\n}\n\n.h-\\[1\\.25em\\] {\n height: 1.25em;\n}\n\n.h-\\[1em\\] {\n height: 1em;\n}\n\n.h-\\[2px\\] {\n height: 2px;\n}\n\n.h-full {\n height: 100%;\n}\n\n.max-h-\\[230px\\] {\n max-height: 230px;\n}\n\n.max-h-full {\n max-height: 100%;\n}\n\n.w-10 {\n width: 2.5rem;\n}\n\n.w-16 {\n width: 4rem;\n}\n\n.w-24 {\n width: 6rem;\n}\n\n.w-28 {\n width: 7rem;\n}\n\n.w-3 {\n width: 0.75rem;\n}\n\n.w-3\\.5 {\n width: 0.875rem;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-48 {\n width: 12rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-60 {\n width: 15rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.w-\\[0\\.6em\\] {\n width: 0.6em;\n}\n\n.w-\\[1\\.25em\\] {\n width: 1.25em;\n}\n\n.w-\\[352px\\] {\n width: 352px;\n}\n\n.w-full {\n width: 100%;\n}\n\n.max-w-\\[26rem\\] {\n max-width: 26rem;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n\n.flex-grow {\n flex-grow: 1;\n}\n\n.-translate-y-2 {\n --tw-translate-y: -0.5rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.-translate-y-4 {\n --tw-translate-y: -1rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.translate-x-2 {\n --tw-translate-x: 0.5rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.translate-y-0 {\n --tw-translate-y: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.scale-50 {\n --tw-scale-x: .5;\n --tw-scale-y: .5;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n@keyframes spin {\n\n to {\n transform: rotate(360deg);\n }\n}\n\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.cursor-text {\n cursor: text;\n}\n\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.grid-cols-\\[1fr_auto_1fr\\] {\n grid-template-columns: 1fr auto 1fr;\n}\n\n.flex-col {\n flex-direction: column;\n}\n\n.place-items-center {\n place-items: center;\n}\n\n.items-end {\n align-items: flex-end;\n}\n\n.items-center {\n align-items: center;\n}\n\n.justify-end {\n justify-content: flex-end;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-between {\n justify-content: space-between;\n}\n\n.gap-1 {\n gap: 0.25rem;\n}\n\n.gap-2 {\n gap: 0.5rem;\n}\n\n.gap-2\\.5 {\n gap: 0.625rem;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.gap-5 {\n gap: 1.25rem;\n}\n\n.gap-6 {\n gap: 1.5rem;\n}\n\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n\n.divide-y > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-y-reverse: 0;\n border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n border-bottom-width: calc(1px * var(--tw-divide-y-reverse));\n}\n\n.divide-neutral-700 > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-divide-opacity));\n}\n\n.divide-neutral-800 > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-opacity: 1;\n border-color: rgb(38 38 38 / var(--tw-divide-opacity));\n}\n\n.self-auto {\n align-self: auto;\n}\n\n.self-center {\n align-self: center;\n}\n\n.overflow-auto {\n overflow: auto;\n}\n\n.overflow-clip {\n overflow: clip;\n}\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.whitespace-nowrap {\n white-space: nowrap;\n}\n\n.whitespace-pre-wrap {\n white-space: pre-wrap;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-2 {\n border-width: 2px;\n}\n\n.border-4 {\n border-width: 4px;\n}\n\n.border-dashed {\n border-style: dashed;\n}\n\n.border-neutral-300 {\n --tw-border-opacity: 1;\n border-color: rgb(212 212 212 / var(--tw-border-opacity));\n}\n\n.border-neutral-700 {\n --tw-border-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-border-opacity));\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.border-white\\/50 {\n border-color: rgb(255 255 255 / 0.5);\n}\n\n.bg-black\\/10 {\n background-color: rgb(0 0 0 / 0.1);\n}\n\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.bg-blue-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(29 78 216 / var(--tw-bg-opacity));\n}\n\n.bg-blue-700\\/60 {\n background-color: rgb(29 78 216 / 0.6);\n}\n\n.bg-green-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(245 245 245 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(38 38 38 / var(--tw-bg-opacity));\n}\n\n.bg-neutral-800\\/85 {\n background-color: rgb(38 38 38 / 0.85);\n}\n\n.bg-neutral-900 {\n --tw-bg-opacity: 1;\n background-color: rgb(23 23 23 / var(--tw-bg-opacity));\n}\n\n.bg-orange-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 115 22 / var(--tw-bg-opacity));\n}\n\n.bg-orange-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(234 88 12 / var(--tw-bg-opacity));\n}\n\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n\n.bg-transparent {\n background-color: transparent;\n}\n\n.bg-gradient-to-b {\n background-image: linear-gradient(to bottom, var(--tw-gradient-stops));\n}\n\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n\n.to-blue-700 {\n --tw-gradient-to: #1d4ed8 var(--tw-gradient-to-position);\n}\n\n.bg-cover {\n background-size: cover;\n}\n\n.bg-center {\n background-position: center;\n}\n\n.bg-no-repeat {\n background-repeat: no-repeat;\n}\n\n.object-cover {\n object-fit: cover;\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-2 {\n padding: 0.5rem;\n}\n\n.p-2\\.5 {\n padding: 0.625rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.p-4 {\n padding: 1rem;\n}\n\n.p-6 {\n padding: 1.5rem;\n}\n\n.p-\\[\\.75em\\] {\n padding: .75em;\n}\n\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.py-8 {\n padding-top: 2rem;\n padding-bottom: 2rem;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem;\n}\n\n.pb-8 {\n padding-bottom: 2rem;\n}\n\n.pt-10 {\n padding-top: 2.5rem;\n}\n\n.pt-8 {\n padding-top: 2rem;\n}\n\n.text-left {\n text-align: left;\n}\n\n.text-center {\n text-align: center;\n}\n\n.font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n\n.text-\\[\\.75em\\] {\n font-size: .75em;\n}\n\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n\n.font-bold {\n font-weight: 700;\n}\n\n.font-medium {\n font-weight: 500;\n}\n\n.leading-loose {\n line-height: 2;\n}\n\n.leading-none {\n line-height: 1;\n}\n\n.tracking-\\[-1ch\\] {\n letter-spacing: -1ch;\n}\n\n.text-amber-500 {\n --tw-text-opacity: 1;\n color: rgb(245 158 11 / var(--tw-text-opacity));\n}\n\n.text-black {\n --tw-text-opacity: 1;\n color: rgb(0 0 0 / var(--tw-text-opacity));\n}\n\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity));\n}\n\n.text-green-600 {\n --tw-text-opacity: 1;\n color: rgb(22 163 74 / var(--tw-text-opacity));\n}\n\n.text-neutral-300 {\n --tw-text-opacity: 1;\n color: rgb(212 212 212 / var(--tw-text-opacity));\n}\n\n.text-neutral-400 {\n --tw-text-opacity: 1;\n color: rgb(163 163 163 / var(--tw-text-opacity));\n}\n\n.text-neutral-500 {\n --tw-text-opacity: 1;\n color: rgb(115 115 115 / var(--tw-text-opacity));\n}\n\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgb(249 115 22 / var(--tw-text-opacity));\n}\n\n.text-transparent {\n color: transparent;\n}\n\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.text-white\\/20 {\n color: rgb(255 255 255 / 0.2);\n}\n\n.text-white\\/50 {\n color: rgb(255 255 255 / 0.5);\n}\n\n.text-white\\/80 {\n color: rgb(255 255 255 / 0.8);\n}\n\n.underline {\n text-decoration-line: underline;\n}\n\n.decoration-neutral-500 {\n text-decoration-color: #737373;\n}\n\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n\n.opacity-0 {\n opacity: 0;\n}\n\n.opacity-100 {\n opacity: 1;\n}\n\n.opacity-25 {\n opacity: 0.25;\n}\n\n.opacity-30 {\n opacity: 0.3;\n}\n\n.opacity-50 {\n opacity: 0.5;\n}\n\n.opacity-75 {\n opacity: 0.75;\n}\n\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.ring-1 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.ring-neutral-700\\/50 {\n --tw-ring-color: rgb(64 64 64 / 0.5);\n}\n\n.ring-transparent {\n --tw-ring-color: transparent;\n}\n\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.duration-100 {\n transition-duration: 100ms;\n}\n\n.duration-300 {\n transition-duration: 300ms;\n}\n\n.ease-linear {\n transition-timing-function: linear;\n}\n\n@keyframes enter {\n\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n\n@keyframes exit {\n\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n\n.animate-in {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n\n.animate-out {\n animation-name: exit;\n animation-duration: 150ms;\n --tw-exit-opacity: initial;\n --tw-exit-scale: initial;\n --tw-exit-rotate: initial;\n --tw-exit-translate-x: initial;\n --tw-exit-translate-y: initial;\n}\n\n.fade-in {\n --tw-enter-opacity: 0;\n}\n\n.fade-out {\n --tw-exit-opacity: 0;\n}\n\n.slide-in-from-bottom-16 {\n --tw-enter-translate-y: 4rem;\n}\n\n.slide-in-from-bottom-2 {\n --tw-enter-translate-y: 0.5rem;\n}\n\n.slide-in-from-bottom-8 {\n --tw-enter-translate-y: 2rem;\n}\n\n.slide-in-from-top-2 {\n --tw-enter-translate-y: -0.5rem;\n}\n\n.animate-duration-300 {\n animation-duration: 300ms;\n}\n\n.ease-linear {\n animation-timing-function: linear;\n}\n\n@property --tw-border-gradient-angle {\n syntax: '<angle>';\n inherits: true;\n initial-value: 0deg;\n}\n\n@property --tw-conic-gradient-angle {\n syntax: '<angle>';\n inherits: true;\n initial-value: 0deg;\n}\n\n@keyframes border-gradient {\n\n to {\n --tw-border-gradient-angle: 360deg;\n }\n}\n\n.placeholder\\:text-neutral-500::placeholder {\n --tw-text-opacity: 1;\n color: rgb(115 115 115 / var(--tw-text-opacity));\n}\n\n.after\\:select-none::after {\n content: var(--tw-content);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.after\\:content-\\[\\'\\2026\\'\\]::after {\n --tw-content: '…';\n content: var(--tw-content);\n}\n\n.focus-within\\:border-transparent:focus-within {\n border-color: transparent;\n}\n\n.focus-within\\:ring-orange-500:focus-within {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(249 115 22 / var(--tw-ring-opacity));\n}\n\n.hover\\:bg-blue-500:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n\n.hover\\:bg-neutral-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(229 229 229 / var(--tw-bg-opacity));\n}\n\n.hover\\:bg-orange-400:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(251 146 60 / var(--tw-bg-opacity));\n}\n\n.hover\\:text-white:hover {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.hover\\:text-white\\/40:hover {\n color: rgb(255 255 255 / 0.4);\n}\n\n.hover\\:text-white\\/80:hover {\n color: rgb(255 255 255 / 0.8);\n}\n\n.hover\\:decoration-orange-500:hover {\n text-decoration-color: #f97316;\n}\n\n.hover\\:brightness-125:hover {\n --tw-brightness: brightness(1.25);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.focus\\:border-orange-500:focus {\n --tw-border-opacity: 1;\n border-color: rgb(249 115 22 / var(--tw-border-opacity));\n}\n\n.focus\\:border-yellow-400:focus {\n --tw-border-opacity: 1;\n border-color: rgb(250 204 21 / var(--tw-border-opacity));\n}\n\n.focus\\:bg-neutral-700:focus {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.active\\:bg-orange-600:active {\n --tw-bg-opacity: 1;\n background-color: rgb(234 88 12 / var(--tw-bg-opacity));\n}\n\n.active\\:brightness-150:active {\n --tw-brightness: brightness(1.5);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.group:hover .group-hover\\:pointer-events-none {\n pointer-events: none;\n}\n\n.group:hover .group-hover\\:pointer-events-auto {\n pointer-events: auto;\n}\n\n.group:hover .group-hover\\:inline-block {\n display: inline-block;\n}\n\n.group:hover .group-hover\\:hidden {\n display: none;\n}\n\n.group:hover .group-hover\\:rotate-90 {\n --tw-rotate: 90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group:hover .group-hover\\:opacity-0 {\n opacity: 0;\n}\n\n.group:hover .group-hover\\:opacity-100 {\n opacity: 1;\n}\n\n.peer:placeholder-shown ~ .peer-placeholder-shown\\:text-neutral-500 {\n --tw-text-opacity: 1;\n color: rgb(115 115 115 / var(--tw-text-opacity));\n}\n\n.aria-busy\\:pointer-events-none[aria-busy=\"true\"] {\n pointer-events: none;\n}\n\n.aria-busy\\:bg-blue-500[aria-busy=\"true\"] {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n\n.aria-disabled\\:pointer-events-none[aria-disabled=\"true\"] {\n pointer-events: none;\n}\n\n.aria-disabled\\:opacity-50[aria-disabled=\"true\"] {\n opacity: 0.5;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:inline {\n display: inline;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:hidden {\n display: none;\n}\n\n.group\\/button[aria-busy=\"true\"] .group-aria-busy\\/button\\:translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:scale-125 {\n --tw-scale-x: 1.25;\n --tw-scale-y: 1.25;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.group\\/button[aria-busy=\"true\"] .group-aria-busy\\/button\\:opacity-100 {\n opacity: 1;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:opacity-0 {\n opacity: 0;\n}\n\n.group[aria-busy=\"true\"] .group-aria-busy\\:opacity-100 {\n opacity: 1;\n}\n\n.group\\/button[aria-busy=\"true\"] .group-aria-busy\\/button\\:duration-300 {\n transition-duration: 300ms;\n}\n\n.group[aria-expanded=\"true\"] .group-aria-expanded\\:inline {\n display: inline;\n}\n\n.group[aria-expanded=\"true\"] .group-aria-expanded\\:hidden {\n display: none;\n}\n\n.data-\\[highlighted\\]\\:bg-neutral-200[data-highlighted] {\n --tw-bg-opacity: 1;\n background-color: rgb(229 229 229 / var(--tw-bg-opacity));\n}\n\n.data-\\[state\\=checked\\]\\:bg-neutral-900[data-state=\"checked\"] {\n --tw-bg-opacity: 1;\n background-color: rgb(23 23 23 / var(--tw-bg-opacity));\n}\n\n.links\\:font-medium a[href]:not(.links-unset) {\n font-weight: 500;\n}\n\n.links\\:text-white a[href]:not(.links-unset) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.links\\:underline a[href]:not(.links-unset) {\n text-decoration-line: underline;\n}\n\n.links\\:decoration-neutral-500 a[href]:not(.links-unset) {\n text-decoration-color: #737373;\n}\n\n.links\\:underline-offset-4 a[href]:not(.links-unset) {\n text-underline-offset: 4px;\n}\n\n.hover\\:links\\:decoration-orange-500 a[href]:not(.links-unset):hover {\n text-decoration-color: #f97316;\n}\n\n@media (min-width: 640px) {\n\n .sm\\:items-center {\n align-items: center;\n }\n}\n\n.dark\\:border-neutral-700:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-border-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-border-opacity));\n}\n\n.dark\\:bg-neutral-800:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-bg-opacity: 1;\n background-color: rgb(38 38 38 / var(--tw-bg-opacity));\n}\n\n.dark\\:bg-white\\/10:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n background-color: rgb(255 255 255 / 0.1);\n}\n\n.dark\\:text-white:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.dark\\:hover\\:bg-neutral-700:hover:where([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.\\[\\&_\\>_\\:is\\(dt\\2c dd\\)\\]\\:px-1 > :is(dt,dd) {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n\n.\\[\\&_\\>_dd\\]\\:text-right > dd {\n text-align: right;\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 { createContext, useContext, type ReactNode } from \"react\";\nimport { EntryKitConfig } from \"./config/output\";\nimport { Chain } from \"viem\";\nimport { useChains } from \"wagmi\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\nimport { ConnectKitProvider } from \"connectkit\";\n\ntype ContextValue = EntryKitConfig & {\n chain: Chain;\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 // This throws when no we can't find a bundler to talk to, so use it to validate the chain.\n getBundlerTransport(chain);\n\n return (\n <ConnectKitProvider\n theme=\"midnight\"\n options={{\n // Prevent Wagmi trying to switch chains after connection\n // https://github.com/wevm/wagmi/blob/f5b717ccf8a5b283263cadc984ba00b354bcefae/packages/core/src/connectors/injected.ts#L174-L182\n initialChainId: 0,\n }}\n >\n <Context.Provider value={{ ...config, chain }}>{children}</Context.Provider>\n </ConnectKitProvider>\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 { transactionQueue } from \"@latticexyz/common/actions\";\nimport { Chain, createClient, fallback, http, keccak256, stringToHex, webSocket } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { userOpExecutor } from \"./quarry/transports/userOpExecutor\";\nimport { wiresaw } from \"@latticexyz/common/internal\";\n\nexport function getBundlerTransport(chain: Chain) {\n if (\"wiresaw\" in chain.rpcUrls) {\n return wiresaw();\n }\n\n // TODO: bundler websocket\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n if (bundlerHttpUrl) {\n return http(bundlerHttpUrl);\n }\n\n if (chain.id === 31337) {\n return userOpExecutor({\n executor: createClient({\n chain,\n transport: fallback([webSocket(), http()]),\n account: privateKeyToAccount(keccak256(stringToHex(\"local user op executor\"))),\n pollingInterval: 10,\n }).extend(transactionQueue()),\n fallbackDefaultTransport: http(),\n });\n }\n\n throw new Error(`Chain ${chain.id} config did not include a bundler RPC URL.`);\n}\n","import {\n BundlerRpcSchema,\n EIP1193RequestFn,\n Hash,\n RpcUserOperationReceipt,\n Transport,\n createTransport,\n getAbiItem,\n numberToHex,\n parseEther,\n} from \"viem\";\nimport {\n entryPoint06Abi,\n entryPoint06Address,\n entryPoint07Address,\n entryPoint08Address,\n} from \"viem/account-abstraction\";\nimport { TransportRequestFn } from \"./common\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { sendUserOperation } from \"./methods/sendUserOperation\";\nimport { ConnectedClient } from \"../../common\";\nimport { debug } from \"../debug\";\nimport { getLogs, getTransactionReceipt, setBalance } from \"viem/actions\";\nimport { getUserOperationReceipt } from \"@latticexyz/common/internal\";\n\n// TODO: move to common package?\n\nexport function userOpExecutor({\n executor,\n fallbackDefaultTransport,\n}: {\n executor: ConnectedClient;\n fallbackDefaultTransport: Transport;\n}): Transport {\n return (opts) => {\n debug(\"using a local user op executor\", executor.account.address);\n\n if (executor.chain.id === 31337) {\n debug(\"setting executor balance\");\n setBalance(\n executor.extend(() => ({ mode: \"anvil\" })),\n {\n address: executor.account.address,\n value: parseEther(\"100\"),\n },\n );\n }\n\n const receipts = new Map<Hash, RpcUserOperationReceipt<\"0.7\">>();\n\n // @ts-expect-error TODO\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 [userOpHash] = params;\n if (receipts.has(userOpHash)) return receipts.get(userOpHash)!;\n\n const event = getAbiItem({\n abi: entryPoint06Abi,\n name: \"UserOperationEvent\",\n });\n\n const log = (\n await getLogs(executor, {\n address: [entryPoint06Address, entryPoint07Address, entryPoint08Address],\n event,\n args: { userOpHash },\n })\n ).at(0);\n\n if (!log) return null;\n const hash = log.transactionHash;\n const receipt = await getTransactionReceipt(executor, { hash });\n\n const userOpReceipt = getUserOperationReceipt(userOpHash, {\n ...receipt,\n blobGasPrice: receipt.blobGasPrice ? numberToHex(receipt.blobGasPrice) : undefined,\n blobGasUsed: receipt.blobGasUsed ? numberToHex(receipt.blobGasUsed) : undefined,\n blockNumber: numberToHex(receipt.blockNumber),\n cumulativeGasUsed: numberToHex(receipt.cumulativeGasUsed),\n effectiveGasPrice: numberToHex(receipt.effectiveGasPrice),\n gasUsed: numberToHex(receipt.gasUsed),\n logs: receipt.logs.map((log) => ({\n ...log,\n blockNumber: numberToHex(log.blockNumber),\n logIndex: numberToHex(log.logIndex),\n transactionIndex: numberToHex(log.transactionIndex),\n })),\n status: receipt.status as never,\n transactionIndex: numberToHex(receipt.transactionIndex),\n });\n\n return userOpReceipt;\n }\n\n if (method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas(params);\n }\n\n debug(`userOpExecutor: method \"${method}\" not overridden, falling back to fallback transport`);\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n\n return fallbackRequest({ method, params });\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 { getRpcMethod } from \"../common\";\n\n// TODO: revisit after demo (don't hardcode gas)\n\ntype rpcMethod = getRpcMethod<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: 20_000_000n,\n preVerificationGas: 200_000n,\n verificationGasLimit: 2_000_000n,\n paymasterVerificationGasLimit: 200_000n,\n paymasterPostOpGasLimit: 200_000n,\n });\n}\n","import { RpcUserOperation, RpcUserOperationReceipt, parseEventLogs } from \"viem\";\nimport {\n formatUserOperation,\n toPackedUserOperation,\n getUserOperationHash,\n entryPoint07Address,\n entryPoint07Abi,\n} from \"viem/account-abstraction\";\nimport { waitForTransactionReceipt, writeContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\nimport { ConnectedClient } from \"../../../common\";\n\n// TODO: move to common package?\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: ConnectedClient;\n rpcUserOp: RpcUserOperation<entryPointVersion>;\n}): Promise<\n Pick<RpcUserOperationReceipt<entryPointVersion>, \"success\" | \"userOpHash\"> & {\n receipt: Pick<RpcUserOperationReceipt<entryPointVersion>[\"receipt\"], \"transactionHash\">;\n }\n> {\n const userOp = formatUserOperation(rpcUserOp);\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 });\n\n const receipt = await getAction(\n executor,\n waitForTransactionReceipt,\n \"waitForTransactionReceipt\",\n )({ hash: transactionHash });\n\n // TODO: replace with `getUserOperationReceipt`?\n const parsedLogs = parseEventLogs({\n logs: receipt.logs,\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\" as const,\n });\n\n return {\n success: parsedLogs[0]!.args.success,\n userOpHash,\n receipt,\n };\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"mud:entrykit\");\nexport const error = createDebug(\"mud:entrykit\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"quarry\");\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 { DialogClose } from \"@radix-ui/react-dialog\";\nimport { CloseIcon } from \"./icons/CloseIcon\";\nimport { Logo } from \"./icons/Logo\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { ErrorFallback } from \"./errors/ErrorFallback\";\nimport { ErrorsOverlay } from \"./errors/ErrorsOverlay\";\n\nexport function AccountModal() {\n const { accountModalOpen, toggleAccountModal } = useAccountModal();\n return (\n <Modal open={accountModalOpen} onOpenChange={toggleAccountModal}>\n {accountModalOpen ? (\n <div\n className={twMerge(\n \"relative py-2 ring-1\",\n \"bg-neutral-900 text-neutral-400 ring-neutral-700/50\",\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 <ErrorBoundary FallbackComponent={ErrorFallback}>\n <AccountModalContent />\n <ErrorsOverlay />\n </ErrorBoundary>\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-white/20 hover:text-white/40\",\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 { address: userAddress, connector } = useAccount();\n const userClient = useConnectorClient({ chainId, connector });\n const initialUserAddress = useRef(userAddress);\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n\n return (\n <ConnectedSteps\n connector={connector!}\n userClient={userClient.data}\n initialUserAddress={initialUserAddress.current}\n />\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 { Button } from \"./ui/Button\";\nimport { useModal } from \"connectkit\";\nimport { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useEffect, useRef } from \"react\";\nimport { useConnect, useConnectors } from \"wagmi\";\nimport { IdPlaceConnector, isIdPlaceConnector } from \"@latticexyz/id.place/internal\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function ConnectWallet() {\n const connectors = useConnectors();\n const porto = connectors.find(isIdPlaceConnector);\n\n // TODO: show error states?\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 {porto ? <AccountButton connector={porto} /> : <WalletButton />}\n </div>\n </div>\n );\n}\n\nfunction AccountButton({ connector }: { connector: IdPlaceConnector }) {\n const { setOpen } = useModal();\n const { connect, isPending, error } = useConnect();\n const { chainId } = useEntryKitConfig();\n\n if (error) {\n console.error(\"connect error\", error);\n }\n\n return (\n <>\n <Button\n key=\"signin\"\n variant=\"secondary\"\n className=\"self-auto flex justify-center\"\n pending={isPending}\n onClick={() =>\n connect({\n connector,\n // need to provide both `chainId` and `capabilities` to the\n // Porto connector so a fresh browser instance reusing a synced passkey\n // can be bound to the correct chain ID for the account\n chainId,\n capabilities: {},\n })\n }\n autoFocus\n >\n Sign in\n </Button>\n <button\n className=\"text-sm self-center transition text-neutral-500 hover:text-white p-2\"\n onClick={() => setOpen(true)}\n >\n Already have a wallet?\n </button>\n </>\n );\n}\n\nfunction WalletButton() {\n const { open, setOpen } = useModal();\n const hasAutoOpenedRef = useRef(false);\n\n useEffect(() => {\n if (!open && !hasAutoOpenedRef.current) {\n setOpen(true);\n hasAutoOpenedRef.current = true;\n }\n }, [open, setOpen]);\n\n return (\n <>\n <Button\n key=\"create\"\n variant=\"secondary\"\n className=\"self-auto flex justify-center\"\n onClick={() => setOpen(true)}\n autoFocus\n >\n Connect wallet\n </Button>\n </>\n );\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function 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 { 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 { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { Logo } from \"./icons/Logo\";\nimport { usePreloadImage } from \"./usePreloadImage\";\n\nexport function AppInfo() {\n const { appName, appIcon } = useEntryKitConfig();\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 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 { Address } from \"viem\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ConnectedClient } from \"../common\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Wallet } from \"./Wallet\";\nimport { Session } from \"./Session\";\nimport { Step } from \"./common\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { GasBalance } from \"./GasBalance\";\nimport { GasBalance as QuarryGasBalance } from \"./quarry/GasBalance\";\nimport { Connector } from \"wagmi\";\n\nexport type Props = {\n connector: Connector;\n userClient: ConnectedClient;\n initialUserAddress: Address | undefined;\n};\n\nexport function ConnectedSteps({ connector, userClient, initialUserAddress }: Props) {\n const { chain } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\n const [focusedId, setFocusedId] = useState<string | null>(null);\n\n const userAddress = userClient.account.address;\n const { data: prerequisites, error: prerequisitesError } = usePrerequisites(userAddress);\n\n useEffect(() => {\n if (prerequisitesError) {\n console.error(\"Could not get prerequisites\", prerequisitesError);\n }\n }, [prerequisitesError]);\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 { sessionAddress, hasAllowance, isSpender, hasDelegation, hasGasBalance, hasQuarryGasBalance } =\n 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 const steps: Step[] = [\n {\n id: \"wallet\",\n isComplete: true,\n content: (props) => <Wallet {...props} userAddress={userAddress} />,\n },\n ];\n\n if (!paymaster) {\n if (sessionAddress != null) {\n steps.push({\n id: \"gasBalance\",\n isComplete: !!hasGasBalance,\n content: (props) => <GasBalance {...props} sessionAddress={sessionAddress} />,\n });\n }\n } else if (paymaster.type === \"quarry\") {\n steps.push({\n id: \"gasBalanceQuarry\",\n isComplete: !!hasQuarryGasBalance || !!hasAllowance,\n content: (props) => <QuarryGasBalance {...props} userAddress={userAddress} paymaster={paymaster} />,\n });\n }\n\n steps.push({\n id: \"session\",\n isComplete: !!isSpender && !!hasDelegation,\n content: (props) => (\n <Session\n {...props}\n userClient={userClient}\n connector={connector}\n registerSpender={!isSpender}\n registerDelegation={!hasDelegation}\n />\n ),\n });\n\n return steps;\n }, [\n hasAllowance,\n hasDelegation,\n hasGasBalance,\n hasQuarryGasBalance,\n isSpender,\n paymaster,\n sessionAddress,\n userAddress,\n userClient,\n connector,\n ]);\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 \"px-8 flex flex-col\",\n \"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 const isFocused = focusedId === step.id;\n\n const content = step.content({\n isActive,\n isExpanded,\n isFocused,\n setFocused: (focused: boolean) => setFocusedId(focused ? step.id : null),\n });\n\n if (focusedId) {\n if (step.id === focusedId) {\n return content;\n }\n return null;\n }\n\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 {content}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { Config, useClient, useConfig } from \"wagmi\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getSpenderQueryOptions } from \"./quarry/useSpender\";\nimport { getDelegationQueryOptions } from \"./useDelegation\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { getSessionAccountQueryOptions } from \"../useSessionAccount\";\nimport { getFundsQueryOptions } from \"../useFunds\";\n\nexport function getPrequisitesQueryOptions({\n queryClient,\n config,\n client,\n userAddress,\n worldAddress,\n}: {\n queryClient: QueryClient;\n config: Config;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n worldAddress: Address;\n}) {\n return queryOptions({\n queryKey: [\"getPrerequisites\", client?.uid, userAddress],\n queryFn: async () => {\n if (!client) throw new Error(\"Viem client not ready.\");\n if (!userAddress) throw new Error(\"User not connected.\");\n\n const {\n account: { address: sessionAddress },\n } = await queryClient.fetchQuery(getSessionAccountQueryOptions({ client, userAddress }));\n\n const [funds, spender, hasDelegation] = await Promise.all([\n queryClient.fetchQuery(getFundsQueryOptions({ queryClient, config, client, userAddress })),\n queryClient.fetchQuery(getSpenderQueryOptions({ client, userAddress, sessionAddress })),\n queryClient.fetchQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress })),\n ]);\n\n // TODO: figure out better approach than null for allowance/spender when no quarry paymaster\n const hasAllowance = funds.paymasterAllowance == null || funds.paymasterAllowance > 0n;\n const isSpender = spender == null ? true : spender;\n const hasGasBalance = funds.sessionBalance == null || funds.sessionBalance > 0n;\n const hasQuarryGasBalance = funds.paymasterBalance == null || funds.paymasterBalance > 0n;\n\n return {\n sessionAddress,\n hasAllowance,\n isSpender,\n hasGasBalance,\n hasQuarryGasBalance,\n hasDelegation,\n // we intentionally don't enforce an allowance/gas balance here\n complete: isSpender && hasDelegation,\n };\n },\n retry: false,\n });\n}\n\nexport function usePrerequisites(userAddress: Address | undefined) {\n const queryClient = useQueryClient();\n const config = useConfig();\n const { chainId, 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 config,\n client,\n userAddress,\n worldAddress,\n }),\n queryClient,\n );\n // console.log(\"prereqs\", prereqs.data);\n return prereqs;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getSpender } from \"./getSpender\";\n\nexport function getSpenderQueryOptions({\n client,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getSpender\", client?.uid, userAddress, sessionAddress],\n queryFn:\n client && userAddress && sessionAddress ? () => getSpender({ client, userAddress, sessionAddress }) : skipToken,\n });\n}\n\nexport function useSpender(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSpenderQueryOptions({ client, userAddress, sessionAddress }));\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: import this from quarry-paymaster\n\nexport const paymasterAbi = parseAbi([\n // AllowanceSystem\n \"error AllowanceSystem_InsufficientAllowance(uint256 allowance, uint256 required)\",\n \"error AllowanceSystem_NotAuthorized(address caller, address sponsor, address user)\",\n \"error AllowanceSystem_NotFound(address user, address sponsor)\",\n \"function removeAllowance(address user, address sponsor)\",\n \"function getAllowance(address user) view returns (uint256)\",\n // GrantSystem\n \"error GrantSystem_AllowanceBelowMinimum(uint256 allowance, uint256 min)\",\n \"error GrantSystem_AllowancesLimitReached(uint256 length, uint256 max)\",\n \"error GrantSystem_InsufficientBalance(uint256 balance, uint256 required)\",\n \"function grantAllowance(address user, uint256 allowance) payable\",\n // BalanceSystem\n \"error BalanceSystem_InsufficientBalance(address user, uint256 amount, uint256 balance)\",\n \"function depositTo(address to) payable\",\n \"function withdrawTo(address to, uint256 amount)\",\n // SpenderSystem\n \"error SpenderSystem_AlreadyRegistered(address spender, address user)\",\n \"error SpenderSystem_HasOwnBalance(address spender)\",\n \"function registerSpender(address spender)\",\n // PaymasterSystem\n \"error PaymasterSystem_InsufficientFunds(address user, uint256 maxCost, uint256 availableAllowance, uint256 availableBalance)\",\n \"error PaymasterSystem_OnlyEntryPoint()\",\n]);\n\nexport const paymasterConfig = defineStore({\n namespaces: {\n root: {\n namespace: \"\",\n tables: {\n // Balance gets deposited and is withdrawable\n Balance: {\n schema: {\n user: \"address\",\n balance: \"uint256\",\n },\n key: [\"user\"],\n },\n // Allowance gets granted and is not withdrawable\n // Allowance is organized as a linked list and gets spent from smallest to largest\n Allowance: {\n name: \"AllowanceV2\",\n schema: {\n user: \"address\",\n sponsor: \"address\",\n allowance: \"uint256\",\n next: \"address\",\n previous: \"address\",\n },\n key: [\"user\", \"sponsor\"],\n },\n AllowanceList: {\n schema: {\n user: \"address\",\n first: \"address\",\n length: \"uint256\",\n },\n key: [\"user\"],\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, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"../../quarry/common\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport { getPaymaster } from \"../../getPaymaster\";\n\nexport type GetSpenderParams = {\n client: Client<Transport, Chain>;\n userAddress: Address;\n sessionAddress: Address;\n};\n\nexport async function getSpender({ client, userAddress, sessionAddress }: GetSpenderParams) {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return null;\n\n const record = await getRecord(client, {\n address: paymaster.address,\n table: paymasterTables.Spender,\n key: { spender: sessionAddress },\n blockTag: \"pending\",\n });\n return record.user.toLowerCase() === userAddress.toLowerCase();\n}\n","import { Chain, Hex } from \"viem\";\n\nexport type Paymaster = {\n readonly type: \"simple\" | \"quarry\";\n readonly address: Hex;\n readonly canSponsor?: boolean;\n};\n\nexport function getPaymaster(chain: Chain): Paymaster | undefined {\n const contracts = chain.contracts ?? {};\n\n if (\"quarryPaymaster\" in contracts && contracts.quarryPaymaster != null) {\n if (\"address\" in contracts.quarryPaymaster) {\n return {\n type: \"quarry\",\n address: contracts.quarryPaymaster.address,\n canSponsor: !!chain.rpcUrls.quarrySponsor?.http?.[0],\n };\n }\n }\n\n if (\"paymaster\" in contracts && contracts.paymaster != null) {\n if (\"address\" in contracts.paymaster) {\n return {\n type: \"simple\",\n address: contracts.paymaster.address,\n };\n }\n }\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, 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 return queryOptions({\n queryKey: [\"getDelegation\", client?.uid, worldAddress, userAddress, sessionAddress],\n queryFn:\n client && userAddress && sessionAddress\n ? () => getDelegation({ client, worldAddress, userAddress, sessionAddress })\n : skipToken,\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, Client } from \"viem\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport { unlimitedDelegationControlId, worldTables } from \"../common\";\n\nexport type GetDelegationParams = {\n client: Client;\n worldAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n blockTag?: \"pending\" | \"latest\";\n};\n\n// TODO: rename to `hasDelegation`?\nexport async function getDelegation({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n // TODO: move everything to latest instead of pending\n blockTag = \"pending\",\n}: GetDelegationParams) {\n const record = await getRecord(client, {\n address: worldAddress,\n table: worldTables.UserDelegationControl,\n key: { delegator: userAddress, delegatee: sessionAddress },\n blockTag,\n });\n return record.delegationControlId === unlimitedDelegationControlId;\n}\n","import { resourceToHex } from \"@latticexyz/common\";\nimport { Client, Chain, Transport, Account, parseAbi, ClientConfig, Address, LocalAccount } from \"viem\";\nimport worldConfig from \"@latticexyz/world/mud.config\";\nimport { SmartAccount } from \"viem/account-abstraction\";\n\nexport type ConnectedClient<chain extends Chain = Chain> = Client<Transport, chain, Account>;\nexport type SessionClient<chain extends Chain = Chain> = Client<Transport, chain, SmartAccount> & {\n readonly userAddress: Address;\n /**\n * World address used for delegated calls. Assumes a delegation has been set up between the user account and session account.\n */\n readonly worldAddress: Address;\n /** @internal */\n readonly internal_signer: LocalAccount;\n};\n\nexport const defaultClientConfig = {\n pollingInterval: 250,\n} as const satisfies Pick<ClientConfig, \"pollingInterval\">;\n\n// TODO: move to world\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 { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UndefinedInitialDataOptions, UseQueryResult, queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { GetSessionAccountReturnType, getSessionAccount } from \"./getSessionAccount\";\n\nexport function getSessionAccountQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}): UndefinedInitialDataOptions<GetSessionAccountReturnType> {\n return queryOptions<GetSessionAccountReturnType>({\n queryKey: [\"getSessionAccount\", client?.uid, userAddress],\n queryFn: client && userAddress ? () => getSessionAccount({ client, userAddress }) : skipToken,\n staleTime: Infinity,\n // TODO: replace with function to retry only connection errors\n retry: false,\n });\n}\n\nexport function useSessionAccount(userAddress: Address | undefined): UseQueryResult<GetSessionAccountReturnType> {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getSessionAccountQueryOptions({ userAddress, client }));\n}\n","import { Address, Chain, Client, LocalAccount, Transport } from \"viem\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { toSimpleSmartAccount } from \"permissionless/accounts\";\nimport { getSessionSigner } from \"./getSessionSigner\";\n\nexport type GetSessionAccountReturnType = {\n readonly account: SmartAccount;\n readonly signer: LocalAccount;\n};\n\nexport async function getSessionAccount<chain extends Chain>({\n client,\n userAddress,\n}: {\n client: Client<Transport, chain>;\n userAddress: Address;\n}): Promise<GetSessionAccountReturnType> {\n const signer = getSessionSigner(userAddress);\n const account = await toSimpleSmartAccount({ client, owner: signer });\n return { account, signer };\n}\n","import { Address, isHex } from \"viem\";\nimport { store } from \"./store\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport function getSessionSigner(userAddress: Address) {\n const label = userAddress.toLowerCase() as Address;\n const sessionSignerPrivateKey =\n store.getState().signers[label] ??\n (() => {\n // attempt to reuse previous AccountKit session\n const deprecatedPrivateKey = localStorage\n .getItem(`mud:appSigner:privateKey:${userAddress.toLowerCase()}`)\n ?.replace(/^\"(.*)\"$/, \"$1\");\n const privateKey = isHex(deprecatedPrivateKey) ? deprecatedPrivateKey : generatePrivateKey();\n store.setState((state) => ({\n signers: {\n ...state.signers,\n [label]: privateKey,\n },\n }));\n return privateKey;\n })();\n\n return privateKeyToAccount(sessionSignerPrivateKey);\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}\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", listener);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { Config, useClient, useConfig } from \"wagmi\";\nimport { getBalanceQueryOptions } from \"wagmi/query\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAllowanceQueryOptions } from \"./onboarding/quarry/useAllowance\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { getSessionAccountQueryOptions } from \"./useSessionAccount\";\nimport { getBalanceQueryOptions as getQuarryBalanceQueryOptions } from \"./onboarding/quarry/useBalance\";\n\nexport function getFundsQueryOptions({\n queryClient,\n config,\n client,\n userAddress,\n}: {\n queryClient: QueryClient;\n config: Config;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getFunds\", client?.uid, userAddress],\n queryFn: async () => {\n if (!client) throw new Error(\"Viem client not ready.\");\n if (!userAddress) throw new Error(\"User not connected.\");\n\n const {\n account: { address: sessionAddress },\n } = await queryClient.fetchQuery(getSessionAccountQueryOptions({ client, userAddress }));\n\n const [sessionBalance, paymasterAllowance, paymasterBalance] = await Promise.all([\n queryClient.fetchQuery(getBalanceQueryOptions(config, { chainId: client.chain.id, address: sessionAddress })),\n queryClient.fetchQuery(getAllowanceQueryOptions({ client, userAddress })),\n queryClient.fetchQuery(getQuarryBalanceQueryOptions({ client, userAddress })),\n ]);\n\n return {\n sessionBalance: sessionBalance?.value ?? null,\n paymasterAllowance,\n paymasterBalance,\n };\n },\n retry: false,\n });\n}\n\nexport function useFunds(userAddress: Address | undefined) {\n const queryClient = useQueryClient();\n const config = useConfig();\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n return useQuery(getFundsQueryOptions({ queryClient, config, client, userAddress }), queryClient);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getAllowance } from \"../../quarry/getAllowance\";\n\nexport function getAllowanceQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getAllowance\", client?.uid, userAddress],\n queryFn: client && userAddress ? () => getAllowance({ client, userAddress }) : skipToken,\n });\n}\n\nexport function useAllowance(userAddress: Address | undefined) {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getAllowanceQueryOptions({ client, userAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\nimport { paymasterAbi } from \"./common\";\nimport { getPaymaster } from \"../getPaymaster\";\n\nexport type GetAllowanceParams = {\n client: Client<Transport, Chain>;\n userAddress: Address;\n};\n\nexport async function getAllowance({ client, userAddress }: GetAllowanceParams): Promise<null | bigint> {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return null;\n\n return await getAction(\n client,\n readContract,\n \"readContract\",\n )({\n address: paymaster.address,\n abi: paymasterAbi,\n functionName: \"getAllowance\",\n args: [userAddress],\n });\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getBalance } from \"../../quarry/getBalance\";\n\nexport function getBalanceQueryOptions({\n client,\n userAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n}) {\n return queryOptions({\n queryKey: [\"getBalance\", client?.uid, userAddress],\n queryFn: client && userAddress ? () => getBalance({ client, userAddress }) : skipToken,\n });\n}\n\nexport function useBalance(userAddress: Address | undefined) {\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getBalanceQueryOptions({ client, userAddress }));\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { paymasterTables } from \"./common\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport { getPaymaster } from \"../getPaymaster\";\n\nexport type GetBalanceParams = {\n client: Client<Transport, Chain>;\n userAddress: Address;\n};\n\nexport async function getBalance({ client, userAddress }: GetBalanceParams) {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return null;\n\n const record = await getRecord(client, {\n address: paymaster.address,\n table: paymasterTables.Balance,\n key: { user: userAddress },\n blockTag: \"pending\",\n });\n return record.balance;\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\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { StepContentProps } from \"./common\";\n\nexport type Props = StepContentProps & {\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useShowMutationError(useDisconnect());\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\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 { findCause } from \"@latticexyz/common\";\nimport { createStore } from \"zustand/vanilla\";\n\nexport const store = createStore<{\n readonly lastId: number;\n readonly errors: readonly {\n readonly id: number;\n readonly error: Error;\n readonly dismiss?: () => unknown;\n readonly retry?: () => unknown | Promise<unknown>;\n }[];\n}>(() => ({\n lastId: 0,\n errors: [],\n}));\n\nexport function addError({\n error,\n retry,\n dismiss,\n}: {\n error: Error;\n retry?: () => unknown | Promise<unknown>;\n dismiss?: () => unknown;\n}) {\n // no need to let users know they rejected\n if (findCause(error, ({ name }) => name === \"UserRejectedRequestError\")) {\n return;\n }\n\n store.setState((state) => {\n if (state.errors.some((e) => e.error === error)) {\n return {};\n }\n\n const id = state.lastId + 1;\n return {\n lastId: id,\n errors: [\n ...state.errors,\n {\n id,\n error,\n dismiss: dismiss\n ? () => {\n removeError(error);\n dismiss();\n }\n : undefined,\n retry: retry\n ? async () => {\n removeError(error);\n await retry();\n }\n : undefined,\n },\n ],\n };\n });\n\n return () => {\n removeError(error);\n };\n}\n\nexport function removeError(error: Error) {\n store.setState((state) => ({\n errors: state.errors.filter((e) => e.error !== error),\n }));\n}\n","import { UseMutationResult } from \"@tanstack/react-query\";\nimport { addError } from \"./store\";\nimport { useEffect } from \"react\";\n\nexport function useShowMutationError<result extends Pick<UseMutationResult, \"error\" | \"reset\">>(\n result: result,\n): result {\n const { error, reset } = result;\n\n useEffect(() => {\n if (!error) return;\n return addError({ error, dismiss: reset });\n }, [error, reset]);\n\n return result;\n}\n","import { useEffect } from \"react\";\nimport { Hex } from \"viem\";\nimport { Button } from \"../ui/Button\";\nimport { useSetupSession } from \"./useSetupSession\";\nimport { ConnectedClient } from \"../common\";\nimport { useSessionClient } from \"../useSessionClient\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { StepContentProps } from \"./common\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Connector } from \"wagmi\";\n\nexport type Props = StepContentProps & {\n connector: Connector;\n userClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n sessionAddress?: Hex;\n};\n\nexport function Session({ isActive, isExpanded, connector, userClient, registerSpender, registerDelegation }: Props) {\n const sessionClient = useShowQueryError(useSessionClient(userClient.account.address));\n const setup = useShowMutationError(useSetupSession({ userClient, connector }));\n const hasSession = !registerDelegation && !registerDelegation;\n const { data: prerequisites } = usePrerequisites(userClient.account.address);\n const { hasAllowance, hasGasBalance, hasQuarryGasBalance } = prerequisites ?? {};\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 (\n isActive &&\n setup.status === \"idle\" &&\n sessionClient.data &&\n !hasSession &&\n (hasAllowance || hasGasBalance || hasQuarryGasBalance)\n ) {\n // TODO: re-enable once we can catch/handle window.open errors in popup\n // https://github.com/ithacaxyz/porto/issues/581\n // setup.mutate({\n // sessionClient: sessionClient.data,\n // registerSpender,\n // registerDelegation,\n // });\n }\n });\n return () => clearTimeout(timer);\n }, [\n hasSession,\n isActive,\n registerDelegation,\n registerSpender,\n sessionClient,\n setup,\n hasAllowance,\n hasGasBalance,\n hasQuarryGasBalance,\n ]);\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.data || setup.status === \"pending\"}\n onClick={\n sessionClient.data\n ? () =>\n setup.mutate({\n sessionClient: sessionClient.data,\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 { Hex, encodeFunctionData, parseEventLogs, zeroAddress } from \"viem\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { getAction } from \"viem/utils\";\nimport { entryPoint07Abi, sendUserOperation, waitForUserOperationReceipt } from \"viem/account-abstraction\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { ConnectedClient, unlimitedDelegationControlId, worldAbi } from \"../common\";\nimport { paymasterAbi } from \"../quarry/common\";\nimport { sendCalls, waitForTransactionReceipt } from \"viem/actions\";\nimport { defineCall } from \"../utils/defineCall\";\nimport { Connector, useClient } from \"wagmi\";\nimport { resourceToHex } from \"@latticexyz/common\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\";\nimport { callWithSignature } from \"../utils/callWithSignature\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { systemsConfig as worldSystemsConfig } from \"@latticexyz/world/mud.config\";\nimport { createBundlerClient } from \"../createBundlerClient\";\nimport { getBundlerTransport } from \"../getBundlerTransport\";\nimport { isIdPlaceConnector } from \"@latticexyz/id.place/internal\";\nimport { storeEventsAbi } from \"@latticexyz/store\";\n\nexport function useSetupSession({ connector, userClient }: { connector: Connector; userClient: ConnectedClient }) {\n const queryClient = useQueryClient();\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const mutationKey = [\"setupSession\", client?.chain.id, userClient.account.address];\n return useMutation({\n retry: 0,\n mutationKey,\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 paymaster = getPaymaster(client.chain);\n const sessionAddress = sessionClient.account.address;\n\n console.log(\"setting up session\", userClient);\n\n if (isIdPlaceConnector(connector)) {\n // Set up session for smart account wallet\n const calls = [];\n\n if (registerSpender && paymaster?.type === \"quarry\") {\n console.log(\"registering spender\");\n calls.push(\n defineCall({\n to: paymaster.address,\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.account.address, sessionAddress);\n\n const { id } = await getAction(\n userClient,\n sendCalls,\n \"sendCalls\",\n )({\n account: userClient.account,\n calls,\n });\n console.log(\"got send calls ID\", id);\n\n // TODO: switch to `waitForCallsStatus`, but needs to be able to run \"headless\" (no popup)\n\n const bundlerClient = createBundlerClient({\n transport: getBundlerTransport(client.chain),\n client,\n });\n\n console.log(\"waiting for receipt\");\n const receipt = await getAction(\n bundlerClient,\n waitForUserOperationReceipt,\n \"waitForUserOperationReceipt\",\n )({ hash: id as Hex });\n\n console.log(\"got result\", receipt);\n console.log(\n \"parsed logs\",\n worldAddress,\n parseEventLogs({\n logs: receipt.logs,\n abi: [\n ...entryPoint07Abi,\n // TODO: export account abi from id package\n // ...abi,\n ...worldAbi,\n ...storeEventsAbi,\n ...calls.flatMap((call) => call.abi as never),\n ],\n }),\n );\n } else if (userClient.account.type === \"smart\") {\n // Set up session for smart account wallet\n const calls = [];\n\n if (registerSpender && paymaster?.type === \"quarry\") {\n console.log(\"registering spender\");\n calls.push(\n defineCall({\n to: paymaster.address,\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 } else {\n // Set up session for EOAs\n const txs: Hex[] = [];\n\n if (registerSpender && paymaster?.type === \"quarry\") {\n console.log(\"registering spender\");\n const tx = await callWithSignature({\n client,\n userClient,\n sessionClient,\n worldAddress: paymaster.address,\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: worldSystemsConfig.systems.RegistrationSystem.systemId,\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 }\n\n // attempt to create session smart account instead of doing lazily\n // so downstream can expect the session account to exist\n await (async () => {\n if (await sessionClient.account.isDeployed?.()) return;\n\n console.log(\"creating session account by sending empty user op\");\n const hash = await getAction(\n sessionClient,\n sendUserOperation,\n \"sendUserOperation\",\n )({\n calls: [{ to: zeroAddress }],\n });\n\n const receipt = await getAction(\n sessionClient,\n waitForUserOperationReceipt,\n \"waitForUserOperationReceipt\",\n )({ hash });\n console.log(\"got user op receipt\", receipt);\n })();\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getSpender\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getDelegation\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n });\n}\n","import { Address, ContractFunctionParameters, Abi } from \"viem\";\n\nexport function defineCall<abi extends Abi | readonly unknown[]>(\n call: Omit<ContractFunctionParameters<abi>, \"address\"> & {\n to: Address;\n value?: bigint | undefined;\n },\n) {\n return call;\n}\n","import { Chain, parseErc6492Signature } 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-module-callwithsignature/out/CallWithSignatureSystem.sol/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 rawSignature = await signCall(opts);\n\n // TODO: add support for ERC-6492 inside CallWithSignature module\n const { address, signature } = parseErc6492Signature(rawSignature);\n if (address != null) {\n throw new Error(\n \"ERC-6492 signatures, like from Coinbase Smart Wallet, are not yet supported. Try using a different wallet?\",\n );\n }\n\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-module-callwithsignature/internal\";\nimport { getRecord } from \"@latticexyz/store/internal\";\nimport moduleConfig from \"@latticexyz/world-module-callwithsignature/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: moduleConfig.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 { Transport, Chain, Client, RpcSchema, EstimateFeesPerGasReturnType } from \"viem\";\nimport {\n BundlerClient,\n BundlerClientConfig,\n SmartAccount,\n createBundlerClient as viem_createBundlerClient,\n} from \"viem/account-abstraction\";\nimport { defaultClientConfig } from \"./common\";\nimport { getPaymaster } from \"./getPaymaster\";\nimport { cachedFeesPerGas } from \"./actions/cachedFeesPerGas\";\n\nexport function createBundlerClient<\n transport extends Transport,\n chain extends Chain = Chain,\n account extends SmartAccount = SmartAccount,\n client extends Client = Client,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n config: BundlerClientConfig<transport, chain, account, client, rpcSchema>,\n): BundlerClient<transport, chain, account, client, rpcSchema> {\n // our generics above enforce this, but `BundlerClientConfig` makes it optional again\n const client = config.client;\n if (!client) throw new Error(\"No `client` provided to `createBundlerClient`.\");\n\n const chain = config.chain ?? client.chain;\n const paymaster = chain ? getPaymaster(chain) : undefined;\n\n // TODO: lift this out to make `createBundlerClient` configurable?\n return viem_createBundlerClient({\n ...defaultClientConfig,\n paymaster: paymaster\n ? {\n getPaymasterData: async () => ({\n paymaster: paymaster.address,\n paymasterData: \"0x\",\n }),\n }\n : undefined,\n userOperation: {\n estimateFeesPerGas: createFeeEstimator(client),\n },\n ...config,\n });\n}\n\nfunction createFeeEstimator(client: Client): undefined | (() => Promise<EstimateFeesPerGasReturnType<\"eip1559\">>) {\n if (!client.chain) return;\n\n // anvil hardcodes fee returned by `eth_maxPriorityFeePerGas`\n // so we override it here to mimick our chains\n // https://github.com/foundry-rs/foundry/pull/8081#issuecomment-2402002485\n // TODO: move this to user op executor transport?\n if (client.chain.id === 31337) {\n return async () => ({ maxFeePerGas: 100_000n, maxPriorityFeePerGas: 0n });\n }\n\n // do our own fee calculation for redstone, garnet, pyrope chains\n // to avoid the default RPC call to `eth_getBlockByNumber`\n // https://github.com/wevm/viem/blob/3aa882692d2c4af3f5e9cc152099e07cde28e551/src/actions/public/estimateFeesPerGas.ts#L132\n if ([690, 17069, 695569].includes(client.chain.id)) {\n return cachedFeesPerGas(client);\n }\n}\n","import { Client, EstimateFeesPerGasReturnType } from \"viem\";\nimport { estimateFeesPerGas } from \"viem/actions\";\n\ntype CachedFeesPerGasOptions = {\n refreshInterval?: number;\n};\n\nexport function cachedFeesPerGas(\n client: Client,\n options: CachedFeesPerGasOptions = { refreshInterval: 10_000 },\n): () => Promise<EstimateFeesPerGasReturnType<\"eip1559\">> {\n let fees: EstimateFeesPerGasReturnType<\"eip1559\"> | null = null;\n\n async function refreshFees() {\n fees = await estimateFeesPerGas(client);\n }\n\n refreshFees();\n setInterval(refreshFees, options.refreshInterval);\n\n return async () => {\n if (fees) return fees;\n fees = await estimateFeesPerGas(client);\n return fees;\n };\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport {\n QueryClient,\n UndefinedInitialDataOptions,\n UseQueryResult,\n queryOptions,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { getSessionClient } from \"./getSessionClient\";\nimport { SessionClient } from \"./common\";\nimport { getSessionAccountQueryOptions } from \"./useSessionAccount\";\n\nexport function getSessionClientQueryOptions({\n queryClient,\n client,\n userAddress,\n worldAddress,\n}: {\n queryClient: QueryClient;\n client: Client<Transport, Chain> | undefined;\n userAddress: Address | undefined;\n worldAddress: Address;\n}): UndefinedInitialDataOptions<SessionClient> {\n return queryOptions<SessionClient>({\n queryKey: [\"getSessionClient\", client?.uid, userAddress, worldAddress],\n queryFn: async () => {\n if (!userAddress) throw new Error(\"User not connected.\");\n\n const { account: sessionAccount, signer: sessionSigner } = await queryClient.fetchQuery(\n getSessionAccountQueryOptions({ client, userAddress }),\n );\n return await getSessionClient({\n sessionAccount,\n sessionSigner,\n userAddress,\n worldAddress,\n });\n },\n staleTime: Infinity,\n // TODO: replace with function to retry only connection errors\n retry: false,\n });\n}\n\nexport function useSessionClient(userAddress: Address | undefined): UseQueryResult<SessionClient> {\n const queryClient = useQueryClient();\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(\n getSessionClientQueryOptions({\n queryClient,\n client,\n userAddress,\n worldAddress,\n }),\n );\n}\n","import { Account, Address, Chain, Client, LocalAccount, RpcSchema, Transport } from \"viem\";\nimport { smartAccountActions } from \"permissionless\";\nimport { callFrom, sendUserOperationFrom } from \"@latticexyz/world/internal\";\nimport { createBundlerClient } from \"./createBundlerClient\";\nimport { SessionClient } from \"./common\";\nimport { SmartAccount } from \"viem/account-abstraction\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\n\nexport async function getSessionClient({\n userAddress,\n sessionAccount,\n sessionSigner,\n worldAddress,\n}: {\n userAddress: Address;\n sessionAccount: SmartAccount;\n sessionSigner: LocalAccount;\n worldAddress: Address;\n}): Promise<SessionClient> {\n const client = sessionAccount.client;\n if (!clientHasChain(client)) {\n throw new Error(\"Session account client had no associated chain.\");\n }\n\n const bundlerClient = createBundlerClient({\n transport: getBundlerTransport(client.chain),\n client,\n account: sessionAccount,\n });\n\n const sessionClient = bundlerClient\n .extend(smartAccountActions)\n .extend(\n callFrom({\n worldAddress,\n delegatorAddress: userAddress,\n publicClient: client,\n }),\n )\n .extend(\n sendUserOperationFrom({\n worldAddress,\n delegatorAddress: userAddress,\n publicClient: client,\n }),\n )\n // TODO: add observer once we conditionally fetch receipts while bridge is open\n .extend(() => ({ userAddress, worldAddress, internal_signer: sessionSigner }));\n\n return sessionClient;\n}\n\nfunction clientHasChain<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n client: Client<transport, chain, account, rpcSchema>,\n): client is Client<transport, Exclude<chain, undefined>, account, rpcSchema> {\n return client.chain != null;\n}\n","import { UseQueryResult } from \"@tanstack/react-query\";\nimport { addError } from \"./store\";\nimport { useEffect } from \"react\";\n\nexport function useShowQueryError<result extends Pick<UseQueryResult, \"error\" | \"refetch\">>(result: result): result {\n const { error, refetch } = result;\n\n useEffect(() => {\n if (!error) return;\n return addError({ error, retry: refetch, dismiss: () => {} });\n }, [error, refetch]);\n\n return result;\n}\n","import { useEffect, useState } from \"react\";\nimport { Hex, parseEther } from \"viem\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\nimport { Button } from \"../ui/Button\";\nimport { Balance } from \"../ui/Balance\";\nimport { useBalance, useWatchBlockNumber } from \"wagmi\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport relayChains from \"../data/relayChains.json\";\nimport { useSetBalance } from \"./useSetBalance\";\nimport { RelayChains, StepContentProps } from \"./common\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\nimport { usePrevious } from \"../errors/usePrevious\";\nimport { CopyIcon } from \"../icons/CopyIcon\";\nimport { CheckIcon } from \"../icons/CheckIcon\";\n\nexport type Props = StepContentProps & {\n sessionAddress: Hex;\n};\n\nexport function GasBalance({ isActive, isExpanded, sessionAddress }: Props) {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n const [copied, setCopied] = useState(false);\n\n const balance = useShowQueryError(useBalance({ chainId: chain.id, address: sessionAddress }));\n const prevBalance = usePrevious(balance.data);\n useWatchBlockNumber({ onBlockNumber: () => balance.refetch() });\n\n const setBalance = useShowMutationError(useSetBalance());\n const relayChain = (relayChains as RelayChains)[chain.id];\n\n const handleCopy = () => {\n navigator.clipboard.writeText(sessionAddress);\n\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n useEffect(() => {\n if (balance.data != null && prevBalance?.value === 0n && balance.data.value > 0n) {\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] });\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] });\n }\n }, [balance.data, prevBalance, setBalance, sessionAddress, queryClient]);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Gas balance</div>\n <div className=\"font-mono text-white\">\n {balance.data != null ? <Balance wei={balance.data.value} /> : <PendingIcon className=\"text-sm\" />}\n </div>\n </div>\n\n {chain.id === 31337 ? (\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={balance.status === \"pending\" || setBalance.status === \"pending\"}\n onClick={() =>\n setBalance.mutate({\n address: sessionAddress,\n value: parseEther(\"0.01\") + (balance.data?.value ?? 0n),\n })\n }\n >\n Top up\n </Button>\n ) : relayChain != null ? (\n // TODO: convert this to a <ButtonLink>\n <a\n href={`${relayChain.bridgeUrl}?${new URLSearchParams({ toAddress: sessionAddress, amount: \"0.01\" })}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={balance.status === \"pending\"}\n >\n Top up\n </Button>\n </a>\n ) : null}\n </div>\n {isExpanded ? (\n <>\n <p className=\"text-sm\">Your session&apos;s gas balance is used to pay for onchain computation.</p>\n <p className=\"text-sm\">\n Send funds to{\" \"}\n <span\n className=\"inline-flex items-center gap-1 font-mono text-white cursor-pointer hover:text-white/80 transition-colors\"\n onClick={handleCopy}\n title=\"Click to copy\"\n >\n <TruncatedHex hex={sessionAddress} />{\" \"}\n {copied ? <CheckIcon className=\"w-3.5 h-3.5\" /> : <CopyIcon className=\"w-3.5 h-3.5\" />}\n </span>{\" \"}\n on {chain.name} to top up your session balance.\n </p>\n </>\n ) : null}\n </div>\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 parsed = parseFloat(formatted);\n\n if (parsed > 0 && parsed < 0.00001) {\n return \"<0.00001\";\n }\n\n const magnitude = Math.floor(parsed).toString().length;\n return parsed.toLocaleString(\"en-US\", { maximumFractionDigits: Math.max(0, 6 - magnitude) });\n}\n","import { EthIcon } from \"../icons/EthIcon\";\nimport { formatBalance } from \"../formatBalance\";\nimport { formatEther } from \"viem\";\n\nexport type Props = {\n wei: bigint;\n};\n\nexport function Balance({ wei }: Props) {\n return (\n <span className=\"inline-flex items-center gap-1\" title={formatEther(wei)}>\n {formatBalance(wei)} <EthIcon />\n </span>\n );\n}\n","{\n \"1\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ethereum\"\n },\n \"10\": {\n \"bridgeUrl\": \"https://relay.link/bridge/optimism\"\n },\n \"56\": {\n \"bridgeUrl\": \"https://relay.link/bridge/bnb\"\n },\n \"100\": {\n \"bridgeUrl\": \"https://relay.link/bridge/gnosis\"\n },\n \"111\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/bob\"\n },\n \"130\": {\n \"bridgeUrl\": \"https://relay.link/bridge/unichain\"\n },\n \"137\": {\n \"bridgeUrl\": \"https://relay.link/bridge/polygon\"\n },\n \"146\": {\n \"bridgeUrl\": \"https://relay.link/bridge/sonic\"\n },\n \"185\": {\n \"bridgeUrl\": \"https://relay.link/bridge/mint\"\n },\n \"288\": {\n \"bridgeUrl\": \"https://relay.link/bridge/boba\"\n },\n \"324\": {\n \"bridgeUrl\": \"https://relay.link/bridge/zksync\"\n },\n \"360\": {\n \"bridgeUrl\": \"https://relay.link/bridge/shape\"\n },\n \"480\": {\n \"bridgeUrl\": \"https://relay.link/bridge/world-chain\"\n },\n \"690\": {\n \"bridgeUrl\": \"https://relay.link/bridge/redstone\"\n },\n \"747\": {\n \"bridgeUrl\": \"https://relay.link/bridge/flow-evm\"\n },\n \"919\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/mode-testnet\"\n },\n \"1101\": {\n \"bridgeUrl\": \"https://relay.link/bridge/polygon-zkevm\"\n },\n \"1135\": {\n \"bridgeUrl\": \"https://relay.link/bridge/lisk\"\n },\n \"1301\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/unichain-sepolia\"\n },\n \"1329\": {\n \"bridgeUrl\": \"https://relay.link/bridge/sei\"\n },\n \"1424\": {\n \"bridgeUrl\": \"https://relay.link/bridge/perennial\"\n },\n \"1514\": {\n \"bridgeUrl\": \"https://relay.link/bridge/story\"\n },\n \"1625\": {\n \"bridgeUrl\": \"https://relay.link/bridge/gravity\"\n },\n \"1868\": {\n \"bridgeUrl\": \"https://relay.link/bridge/soneium\"\n },\n \"1923\": {\n \"bridgeUrl\": \"https://relay.link/bridge/swellchain\"\n },\n \"1993\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/b3\"\n },\n \"1996\": {\n \"bridgeUrl\": \"https://relay.link/bridge/sanko\"\n },\n \"2187\": {\n \"bridgeUrl\": \"https://relay.link/bridge/game7\"\n },\n \"2741\": {\n \"bridgeUrl\": \"https://relay.link/bridge/abstract\"\n },\n \"2911\": {\n \"bridgeUrl\": \"https://relay.link/bridge/hychain\"\n },\n \"4202\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/lisk-sepolia\"\n },\n \"4321\": {\n \"bridgeUrl\": \"https://relay.link/bridge/echos\"\n },\n \"5000\": {\n \"bridgeUrl\": \"https://relay.link/bridge/mantle\"\n },\n \"5112\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ham\"\n },\n \"7560\": {\n \"bridgeUrl\": \"https://relay.link/bridge/cyber\"\n },\n \"7865\": {\n \"bridgeUrl\": \"https://relay.link/bridge/powerloom\"\n },\n \"7897\": {\n \"bridgeUrl\": \"https://relay.link/bridge/arena-z\"\n },\n \"8333\": {\n \"bridgeUrl\": \"https://relay.link/bridge/B3\"\n },\n \"8453\": {\n \"bridgeUrl\": \"https://relay.link/bridge/base\"\n },\n \"9897\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/arena-z-testnet\"\n },\n \"11011\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/shape-sepolia\"\n },\n \"11124\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/abstract\"\n },\n \"13746\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/game7-testnet\"\n },\n \"17000\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/holesky\"\n },\n \"17069\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/garnet\"\n },\n \"17071\": {\n \"bridgeUrl\": \"https://relay.link/bridge/onchain-points\"\n },\n \"33139\": {\n \"bridgeUrl\": \"https://relay.link/bridge/apechain\"\n },\n \"33979\": {\n \"bridgeUrl\": \"https://relay.link/bridge/funki\"\n },\n \"34443\": {\n \"bridgeUrl\": \"https://relay.link/bridge/mode\"\n },\n \"42161\": {\n \"bridgeUrl\": \"https://relay.link/bridge/arbitrum\"\n },\n \"42170\": {\n \"bridgeUrl\": \"https://relay.link/bridge/arbitrum-nova\"\n },\n \"42220\": {\n \"bridgeUrl\": \"https://relay.link/bridge/celo\"\n },\n \"43114\": {\n \"bridgeUrl\": \"https://relay.link/bridge/avalanche\"\n },\n \"55244\": {\n \"bridgeUrl\": \"https://relay.link/bridge/superposition\"\n },\n \"57073\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ink\"\n },\n \"59144\": {\n \"bridgeUrl\": \"https://relay.link/bridge/linea\"\n },\n \"60808\": {\n \"bridgeUrl\": \"https://relay.link/bridge/bob\"\n },\n \"70700\": {\n \"bridgeUrl\": \"https://relay.link/bridge/apex\"\n },\n \"70701\": {\n \"bridgeUrl\": \"https://relay.link/bridge/boss\"\n },\n \"70800\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/apex-testnet\"\n },\n \"70805\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/cloud\"\n },\n \"80002\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/amoy\"\n },\n \"80094\": {\n \"bridgeUrl\": \"https://relay.link/bridge/berachain\"\n },\n \"81457\": {\n \"bridgeUrl\": \"https://relay.link/bridge/blast\"\n },\n \"84532\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/base-sepolia\"\n },\n \"167000\": {\n \"bridgeUrl\": \"https://relay.link/bridge/taiko\"\n },\n \"167009\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/hekla\"\n },\n \"421614\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/arbitrum-sepolia\"\n },\n \"534352\": {\n \"bridgeUrl\": \"https://relay.link/bridge/scroll\"\n },\n \"543210\": {\n \"bridgeUrl\": \"https://relay.link/bridge/zero-network\"\n },\n \"660279\": {\n \"bridgeUrl\": \"https://relay.link/bridge/xai\"\n },\n \"695569\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/pyrope\"\n },\n \"911867\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/odyssey\"\n },\n \"984122\": {\n \"bridgeUrl\": \"https://relay.link/bridge/forma\"\n },\n \"1118190\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/eclipse-testnet\"\n },\n \"3397901\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/funki-testnet\"\n },\n \"3441006\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/manta-pacific-testnet\"\n },\n \"4457845\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/zero-sepolia\"\n },\n \"7777777\": {\n \"bridgeUrl\": \"https://relay.link/bridge/zora\"\n },\n \"8253038\": {\n \"bridgeUrl\": \"https://relay.link/bridge/bitcoin\"\n },\n \"9092725\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/bitcoin-testnet4\"\n },\n \"9286185\": {\n \"bridgeUrl\": \"https://relay.link/bridge/eclipse\"\n },\n \"11155111\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/sepolia\"\n },\n \"11155420\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/op-sepolia\"\n },\n \"666666666\": {\n \"bridgeUrl\": \"https://relay.link/bridge/degen\"\n },\n \"792703809\": {\n \"bridgeUrl\": \"https://relay.link/bridge/solana\"\n },\n \"845320008\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/lordchain-testnet\"\n },\n \"888888888\": {\n \"bridgeUrl\": \"https://relay.link/bridge/ancient8\"\n },\n \"999999999\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/zora-sepolia\"\n },\n \"1380012617\": {\n \"bridgeUrl\": \"https://relay.link/bridge/rari\"\n },\n \"1936682084\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/solana-devnet\"\n },\n \"88153591557\": {\n \"bridgeUrl\": \"https://testnets.relay.link/bridge/arbitrum-blueberry\"\n }\n}\n","import { useQueryClient, useMutation } from \"@tanstack/react-query\";\nimport { SetBalanceParameters, TestClient } from \"viem\";\nimport { setBalance } from \"viem/actions\";\nimport { useClient } from \"wagmi\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\n\n/**\n * Set balance at address. This assumes the configured chain is an Anvil chain and supports `anvil_setAccountBalance`.\n */\nexport function useSetBalance() {\n const queryClient = useQueryClient();\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n return useMutation({\n retry: 0,\n mutationKey: [\"setBalance\", chainId],\n mutationFn: async (params: SetBalanceParameters) => {\n if (!client) return null;\n\n await setBalance({ ...(client as TestClient), mode: \"anvil\" }, params);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"balance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n\n return null;\n },\n });\n}\n","import { useEffect, useRef } from \"react\";\n\n// TODO: move to react or common package?\nexport function usePrevious<value, initialValue extends value | undefined>(\n value: value,\n initialValue?: initialValue,\n): initialValue extends undefined ? value | undefined : value {\n const ref = useRef<{ value: value }>();\n useEffect(() => {\n ref.current = { value };\n }, [value]);\n return (ref.current ? ref.current.value : initialValue) as never;\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","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function CopyIcon(props: Props) {\n return (\n <IconSVG {...props}>\n <path\n d=\"M8 5H6C4.89543 5 4 5.89543 4 7V19C4 20.1046 4.89543 21 6 21H16C17.1046 21 18 20.1046 18 19V18M8 5C8 6.10457 8.89543 7 10 7H12C13.1046 7 14 6.10457 14 5M8 5C8 3.89543 8.89543 3 10 3H12C13.1046 3 14 3.89543 14 5M14 5H16C17.1046 5 18 5.89543 18 7V10M20 14H10M10 14L13 11M10 14L13 17\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function CheckIcon(props: Props) {\n return (\n <IconSVG {...props}>\n <path\n d=\"M5 13L9 17L19 7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { useEffect } from \"react\";\nimport { Hex } from \"viem\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\nimport { Button } from \"../../ui/Button\";\nimport { Balance } from \"../../ui/Balance\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useBalance } from \"./useBalance\";\nimport { DepositFormContainer } from \"../deposit/DepositFormContainer\";\nimport { ArrowLeftIcon } from \"../../icons/ArrowLeftIcon\";\nimport { StepContentProps } from \"../common\";\nimport { usePrevious } from \"../../errors/usePrevious\";\nimport { WithdrawGasBalanceButton } from \"./WithdrawGasBalanceButton\";\nimport { useAllowance } from \"./useAllowance\";\nimport { useRequestAllowance } from \"./useRequestAllowance\";\nimport { Paymaster } from \"../../getPaymaster\";\n\nexport type Props = StepContentProps & {\n userAddress: Hex;\n paymaster: Paymaster;\n};\n\nexport function GasBalance({ isActive, isExpanded, isFocused, setFocused, userAddress, paymaster }: Props) {\n const queryClient = useQueryClient();\n const balance = useShowQueryError(useBalance(userAddress));\n const prevBalance = usePrevious(balance.data || 0n);\n\n const allowance = useShowQueryError(useAllowance(userAddress));\n const prevAllowance = usePrevious(allowance.data || 0n);\n const requestAllowance = useRequestAllowance();\n\n useEffect(() => {\n if (balance.data != null && prevBalance === 0n && balance.data > 0n) {\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] });\n setFocused(false);\n }\n }, [balance.data, prevBalance, setFocused, queryClient, userAddress]);\n\n useEffect(() => {\n if (allowance.data != null && prevAllowance === 0n && allowance.data > 0n) {\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] });\n setFocused(false);\n }\n }, [allowance.data, prevAllowance, setFocused, queryClient, userAddress]);\n\n const gasBalance = balance.data != null && allowance.data != null ? balance.data + allowance.data : null;\n useEffect(() => {\n if (!isActive) return;\n if (!paymaster.canSponsor) return;\n if (gasBalance !== 0n) return;\n if (requestAllowance.status !== \"idle\") return;\n\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 console.log(\"no funds, requesting allowance\");\n requestAllowance.mutate(userAddress, {\n onSuccess(data) {\n console.log(\"got allowance\", data);\n },\n onError(error) {\n console.log(\"failed to get allowance\", error);\n },\n });\n });\n return () => clearTimeout(timer);\n }, [isActive, paymaster.canSponsor, gasBalance, requestAllowance, userAddress]);\n\n if (isFocused) {\n return (\n <div>\n {isFocused && (\n <div className=\"absolute top-0 left-0\">\n <div\n className=\"flex items-center justify-center w-10 h-10 text-white/20 hover:text-white/40 cursor-pointer\"\n onClick={() => setFocused(false)}\n >\n <ArrowLeftIcon className=\"m-0\" />\n </div>\n </div>\n )}\n <DepositFormContainer />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Gas balance</div>\n <div className=\"font-mono text-white\">\n {gasBalance != null ? <Balance wei={gasBalance} /> : <PendingIcon className=\"text-sm\" />}\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1 justify-center items-center\">\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive || isExpanded}\n pending={\n balance.status === \"pending\" || allowance.status === \"pending\" || requestAllowance.status === \"pending\"\n }\n onClick={() => setFocused(true)}\n >\n Top up\n </Button>\n\n <WithdrawGasBalanceButton userAddress={userAddress} />\n </div>\n </div>\n {isExpanded ? (\n <div className=\"text-sm space-y-2\">\n <p>Your gas balance is used to pay for onchain computation.</p>\n <p>\n You have{\" \"}\n <span className=\"font-mono\">\n {balance.data != null ? <Balance wei={balance.data} /> : <PendingIcon className=\"text-sm\" />}\n </span>{\" \"}\n in gas deposits and{\" \"}\n <span className=\"font-mono\">\n {allowance.data != null ? <Balance wei={allowance.data} /> : <PendingIcon className=\"text-sm\" />}\n </span>{\" \"}\n in gas grants.\n </p>\n </div>\n ) : null}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useChains, useChainId } from \"wagmi\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { DepositViaTransferForm } from \"./DepositViaTransferForm\";\nimport { DepositViaRelayForm } from \"./DepositViaRelayForm\";\nimport { Deposits } from \"./Deposits\";\n\nexport function DepositFormContainer() {\n const { chainId: destinationChainId } = useEntryKitConfig();\n const chainId = useChainId();\n const chains = useChains();\n const [amount, setAmount] = useState<bigint | undefined>(undefined);\n const [sourceChainId, setSourceChainId] = useState(chainId);\n const sourceChain = chains.find(({ id }) => id === sourceChainId)!;\n\n return (\n <div className=\"pt-10 pb-2\">\n {destinationChainId === sourceChainId ? (\n <DepositViaTransferForm\n amount={amount}\n setAmount={setAmount}\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n />\n ) : (\n <DepositViaRelayForm\n amount={amount}\n setAmount={setAmount}\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n />\n )}\n\n <Deposits />\n </div>\n );\n}\n","import { useAccount, useWriteContract, usePrepareTransactionRequest, usePublicClient } from \"wagmi\";\nimport { Chain, encodeFunctionData } from \"viem\";\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { DepositForm } from \"./DepositForm\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../../getPaymaster\";\nimport { paymasterAbi } from \"../../quarry/common\";\nimport { TransferDeposit, useDeposits } from \"./useDeposits\";\n\ntype Props = {\n amount: bigint | undefined;\n setAmount: (amount: bigint | undefined) => void;\n sourceChain: Chain;\n setSourceChainId: (chainId: number) => void;\n};\n\nexport function DepositViaTransferForm({ amount, setAmount, sourceChain, setSourceChainId }: Props) {\n const { chain } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\n const publicClient = usePublicClient();\n const { address: userAddress } = useAccount();\n const { writeContractAsync } = useWriteContract();\n const { addDeposit } = useDeposits();\n\n if (!userAddress) {\n throw new Error(\"User address not found\");\n }\n\n const { data: gasPrice } = useQuery({\n queryKey: [\"gasPrice\", sourceChain.id],\n queryFn: async () => {\n if (!publicClient) throw new Error(\"Public client not available\");\n return publicClient.getGasPrice();\n },\n refetchInterval: 15000,\n enabled: !!publicClient,\n });\n\n const { data: prepareData, error: prepareError } = usePrepareTransactionRequest({\n to: paymaster?.address,\n data: encodeFunctionData({\n abi: paymasterAbi,\n functionName: \"depositTo\",\n args: [userAddress],\n }),\n value: amount,\n });\n\n const deposit = useMutation({\n mutationKey: [\"depositViaTransfer\", amount?.toString()],\n mutationFn: async () => {\n if (!paymaster) throw new Error(\"Paymaster not found\");\n if (!publicClient) throw new Error(\"Public client not found\");\n if (!amount) throw new Error(\"Amount cannot be 0\");\n\n try {\n const hash = await writeContractAsync({\n address: paymaster.address,\n abi: paymasterAbi,\n functionName: \"depositTo\",\n args: [userAddress],\n value: amount,\n });\n\n const receipt = publicClient.waitForTransactionReceipt({ hash }).then((receipt) => {\n if (receipt.status === \"reverted\") {\n throw new Error(\"Transfer transaction reverted.\");\n }\n return receipt;\n });\n\n const pendingDeposit = {\n type: \"transfer\",\n amount,\n chainL1Id: sourceChain.id,\n chainL2Id: chain.id,\n hash,\n receipt,\n start: new Date(),\n estimatedTime: 1000 * 12,\n isComplete: receipt.then(() => undefined),\n } satisfies TransferDeposit;\n\n addDeposit(pendingDeposit);\n } catch (error) {\n console.error(\"Error while depositing via bridge\", error);\n throw error;\n }\n },\n });\n\n const estimatedFee = prepareData?.gas && gasPrice ? prepareData.gas * gasPrice : undefined;\n return (\n <DepositForm\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n amount={amount}\n setAmount={setAmount}\n estimatedFee={{\n fee: estimatedFee,\n isLoading: (!prepareData && !prepareError) || !gasPrice,\n error: prepareError instanceof Error ? prepareError : undefined,\n }}\n estimatedTime=\"A few seconds\"\n onSubmit={async () => {\n await deposit.mutateAsync();\n }}\n submitButton={\n <SubmitButton\n variant=\"primary\"\n amount={amount}\n chainId={sourceChain.id}\n disabled={!!prepareError || !amount || !userAddress}\n pending={deposit.isPending}\n >\n Deposit\n </SubmitButton>\n }\n />\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { Chain } from \"viem\";\nimport { useAccount, useBalance, useWatchBlockNumber } from \"wagmi\";\nimport { useIsMounted } from \"usehooks-ts\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useBalance as useQuarryBalance } from \"../quarry/useBalance\";\nimport { ChainSelect } from \"./ChainSelect\";\nimport { AmountInput } from \"./AmountInput\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { WarningIcon } from \"../../icons/WarningIcon\";\nimport { formatGas } from \"../../formatGas\";\nimport { Balance } from \"../../ui/Balance\";\n\nexport const DEFAULT_DEPOSIT_AMOUNT = 0.005;\n\nexport type Props = {\n sourceChain: Chain;\n setSourceChainId: (chainId: number) => void;\n amount: bigint | undefined;\n setAmount: (amount: bigint | undefined) => void;\n estimatedFee: {\n fee?: bigint | undefined;\n isLoading?: boolean | undefined;\n error: Error | undefined;\n };\n estimatedTime: string;\n onSubmit: () => Promise<void>;\n submitButton: React.ReactNode;\n};\n\nexport function DepositForm({\n sourceChain,\n setSourceChainId,\n amount,\n setAmount,\n estimatedFee,\n estimatedTime,\n onSubmit,\n submitButton,\n}: Props) {\n const amountInputRef = useRef<HTMLInputElement | null>(null);\n const isMounted = useIsMounted();\n\n const { address: userAddress, chainId: userChainId } = useAccount();\n const balance = useShowQueryError(useBalance({ chainId: sourceChain.id, address: userAddress }));\n const quarryBalance = useShowQueryError(useQuarryBalance(userAddress));\n useWatchBlockNumber({\n onBlockNumber: () => {\n balance.refetch();\n quarryBalance.refetch();\n },\n });\n\n const minimumBalance = amount != null ? amount + (estimatedFee?.fee ?? 0n) : undefined;\n const hasMinimumBalance = balance.data != null ? balance.data.value > (minimumBalance ?? 0n) : undefined;\n\n // Re-focus input if chain ID changes (otherwise the chain select is still in focus)\n useEffect(() => {\n amountInputRef.current?.focus();\n }, [userChainId]);\n\n return (\n <form\n className=\"flex flex-col gap-5\"\n onSubmit={async (event) => {\n event.preventDefault();\n\n try {\n await onSubmit();\n if (isMounted()) {\n setAmount(undefined);\n if (amountInputRef.current) {\n amountInputRef.current.value = \"\";\n }\n }\n } catch (error) {\n // Let's hope each deposit form's wrapper is rendering its own errors\n console.error(\"Error during deposit\", error);\n } finally {\n // Re-focus input after submit (otherwise the submit button is still in focus)\n amountInputRef.current?.focus();\n }\n }}\n >\n <div className=\"flex gap-2\">\n <ChainSelect value={sourceChain.id} onChange={setSourceChainId} />\n <AmountInput ref={amountInputRef} initialAmount={amount} onChange={setAmount} />\n </div>\n\n <dl\n className={twMerge(\n \"grid grid-cols-2 divide-y text-sm leading-loose [&_>_:is(dt,dd)]:px-1 [&_>_dd]:text-right\",\n \"divide-neutral-700 text-neutral-400\",\n )}\n >\n <dt>Available to deposit</dt>\n <dd>\n {balance.isSuccess ? (\n <Balance wei={balance.data.value} />\n ) : balance.isError ? (\n <span title={String(balance.error)}>\n <WarningIcon className=\"inline-block text-amber-500\" />\n </span>\n ) : balance.isLoading ? (\n <PendingIcon className=\"inline-block text-xs\" />\n ) : null}\n </dd>\n\n <dt>Gas balance after deposit</dt>\n <dd>\n <Balance wei={(quarryBalance.data ?? 0n) + (amount ?? 0n)} />\n </dd>\n\n <dt>Estimated fee</dt>\n <dd>\n {estimatedFee.fee ? (\n <>{formatGas(estimatedFee.fee)} gwei</>\n ) : estimatedFee.error ? (\n <span title={String(estimatedFee.error)}>\n <WarningIcon className=\"inline-block text-amber-500\" />\n </span>\n ) : estimatedFee.isLoading ? (\n <PendingIcon className=\"inline-block text-xs\" />\n ) : null}\n </dd>\n <dt>Time to deposit</dt>\n <dd>{estimatedTime}</dd>\n </dl>\n\n {hasMinimumBalance ? submitButton : <SubmitButton disabled>Not enough funds</SubmitButton>}\n </form>\n );\n}\n","import { useEffect, useMemo } from \"react\";\nimport { Chain } from \"viem\";\nimport { useSwitchChain } from \"wagmi\";\nimport { twMerge } from \"tailwind-merge\";\nimport * as Select from \"@radix-ui/react-select\";\nimport { RelayChain } from \"@reservoir0x/relay-sdk\";\nimport { useFrame } from \"../../ui/FrameProvider\";\nimport { useTheme } from \"../../useTheme\";\nimport { ChevronUpIcon } from \"../../icons/ChevronUpIcon\";\nimport { ChevronDownIcon } from \"../../icons/ChevronDownIcon\";\nimport { Input } from \"../../ui/Input\";\nimport { ChainIcon } from \"./ChainIcon\";\nimport { useRelay } from \"./useRelay\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useChainBalances } from \"./useChainBalances\";\nimport { Balance } from \"../../ui/Balance\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\n\nexport type ChainWithRelay = Chain & {\n relayChain?: RelayChain & {\n icon?: Record<string, string>;\n };\n};\n\nexport type Props = {\n value: number;\n onChange: (value: number) => void;\n};\n\nexport function ChainSelect({ value, onChange }: Props) {\n const theme = useTheme();\n const { frame } = useFrame();\n const { chains, switchChain } = useSwitchChain();\n const relay = useRelay();\n const relayChains = relay.data?.chains;\n\n const sourceChains = useMemo(() => {\n return chains\n .map((sourceChain) => {\n const relayChain = relayChains?.find((c) => c.id === sourceChain.id);\n return {\n ...sourceChain,\n relayChain,\n } satisfies ChainWithRelay;\n })\n .filter((c) => c.relayChain);\n }, [chains, relayChains]);\n\n const selectedChain = sourceChains.find((c) => c.id === value)!;\n const { data: chainsBalances, isLoading } = useShowQueryError(useChainBalances({ chains: sourceChains }));\n\n const renderedChains = useMemo(() => {\n if (!chainsBalances) return [];\n const chainsWithBalance = chainsBalances\n .filter(({ balance }) => balance.value > 0n)\n .map(({ chain, balance }) => ({ chain, balance: balance.value }));\n\n return chainsWithBalance.length > 0 ? chainsWithBalance : sourceChains.map((chain) => ({ chain, balance: 0n }));\n }, [chainsBalances, sourceChains]);\n\n useEffect(() => {\n if (\n renderedChains.length > 0 &&\n (!selectedChain || !renderedChains.find((c) => c.chain.id === selectedChain?.id))\n ) {\n const defaultChain = renderedChains[0].chain;\n onChange(defaultChain.id);\n switchChain({ chainId: defaultChain.id });\n }\n }, [value, selectedChain, renderedChains, onChange, switchChain]);\n\n return (\n <Select.Root\n value={value.toString()}\n onValueChange={(value) => {\n if (value) {\n const chain = renderedChains.find((item) => item.chain.id.toString() === value)?.chain;\n if (!chain) throw new Error(`Unknown chain selected: ${value}`);\n onChange(chain.id);\n }\n }}\n >\n <Input asChild>\n <Select.Trigger className=\"group inline-flex items-center justify-center\">\n <Select.Value asChild>\n <ChainIcon\n id={selectedChain?.id}\n name={selectedChain?.name}\n url={selectedChain?.relayChain?.icon?.[theme]}\n className=\"w-8\"\n />\n </Select.Value>\n <Select.Icon asChild>\n <>\n <ChevronDownIcon className=\"text-sm -mr-1 group-aria-expanded:hidden\" />\n <ChevronUpIcon className=\"text-sm -mr-1 hidden group-aria-expanded:inline\" />\n </>\n </Select.Icon>\n </Select.Trigger>\n </Input>\n\n {frame.contentDocument ? (\n <Select.Portal container={frame.contentDocument.body}>\n <Select.Content\n position=\"popper\"\n className=\"w-[352px] max-h-[230px] overflow-y-auto mt-1 animate-in fade-in slide-in-from-top-2\"\n >\n <Select.Viewport>\n <Select.Group\n className={twMerge(\n \"flex flex-col border divide-y\",\n \"bg-neutral-800 text-neutral-300 border-neutral-700 divide-neutral-700\",\n )}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center p-4\">\n <PendingIcon className=\"h-6 w-6 animate-spin text-gray-400\" />\n </div>\n ) : (\n renderedChains.map(({ chain, balance }) => {\n // TODO: figure out why up/down arrow jump to top/bottom rather than cycling through items\n return (\n <Select.Item\n key={chain.id}\n value={chain.id.toString()}\n className={twMerge(\n \"group flex p-2.5 gap-2.5 items-center cursor-pointer outline-none\",\n \"text-white focus:bg-neutral-700 data-[state=checked]:bg-neutral-900\",\n )}\n >\n <ChainIcon id={chain.id} name={chain.name} url={chain.relayChain?.icon?.[theme]} />\n <span className=\"flex-grow flex-shrink-0\">{chain.name}</span>\n <span className=\"flex-shrink-0 font-mono text-sm text-neutral-400\">\n <Balance wei={balance} />\n </span>\n </Select.Item>\n );\n })\n )}\n </Select.Group>\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n ) : null}\n </Select.Root>\n );\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function ChevronUpIcon(props: Props) {\n return (\n <IconSVG viewBox=\"0 0 20 20\" {...props}>\n <path\n d=\"M14.7071 12.7071C14.3166 13.0976 13.6834 13.0976 13.2929 12.7071L10 9.41421L6.70711 12.7071C6.31658 13.0976 5.68342 13.0976 5.29289 12.7071C4.90237 12.3166 4.90237 11.6834 5.29289 11.2929L9.29289 7.29289C9.68342 6.90237 10.3166 6.90237 10.7071 7.29289L14.7071 11.2929C15.0976 11.6834 15.0976 12.3166 14.7071 12.7071Z\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </IconSVG>\n );\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function ChevronDownIcon(props: Props) {\n return (\n <IconSVG viewBox=\"0 0 20 20\" {...props}>\n <path\n d=\"M5.29289 7.29289C5.68342 6.90237 6.31658 6.90237 6.70711 7.29289L10 10.5858L13.2929 7.29289C13.6834 6.90237 14.3166 6.90237 14.7071 7.29289C15.0976 7.68342 15.0976 8.31658 14.7071 8.70711L10.7071 12.7071C10.3166 13.0976 9.68342 13.0976 9.29289 12.7071L5.29289 8.70711C4.90237 8.31658 4.90237 7.68342 5.29289 7.29289Z\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </IconSVG>\n );\n}\n","import { isValidElement, cloneElement, Children } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n// We use this in place of Radix's `Slot` because it's missing the ability to merge class names in a way that is Tailwind friendly\n// See https://github.com/radix-ui/primitives/issues/2631\n\nexport type AsChildProps<DefaultElementProps> =\n | ({ asChild?: false } & DefaultElementProps)\n | { asChild: true; children: React.ReactNode };\n\nexport function Slot({\n children,\n ...props\n}: React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n}) {\n if (isValidElement(children)) {\n return cloneElement(children, {\n ...props,\n ...children.props,\n style: {\n ...props.style,\n ...children.props.style,\n },\n className: twMerge(props.className, children.props.className),\n });\n }\n\n if (Children.count(children) > 1) {\n Children.only(null);\n }\n\n return null;\n}\n","import { CSSProperties, InputHTMLAttributes } from \"react\";\nimport { Slot, type AsChildProps } from \"./Slot\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = AsChildProps<InputHTMLAttributes<HTMLInputElement>> & {\n style?: CSSProperties;\n className?: string;\n};\n\nexport function Input({ asChild, className, ...props }: Props) {\n const Child = asChild ? Slot : \"input\";\n return (\n <Child\n className={twMerge(\n \"p-2.5 gap-1 border text-lg font-medium transition\",\n \"outline-none ring-2 ring-transparent focus-within:ring-orange-500 focus-within:border-transparent\",\n \"bg-neutral-900 border-neutral-700 text-white placeholder:text-neutral-500\",\n className,\n )}\n {...props}\n />\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { PreloadedImage } from \"./PreloadedImage\";\nimport { forwardRef } from \"react\";\n\nexport type Props = {\n id: number;\n name: string;\n url: string | undefined;\n className?: string;\n};\n\nexport const ChainIcon = forwardRef<HTMLSpanElement, Props>(function ChainIcon({ name, url, className }, forwardedRef) {\n return (\n <span\n ref={forwardedRef}\n className={twMerge(\"flex-shrink-0 inline-flex w-6 aspect-square rounded-full overflow-clip\", className)}\n >\n {url ? (\n <PreloadedImage url={url} />\n ) : (\n // TODO: better placeholder\n <span\n className={twMerge(\n \"inline-flex items-center justify-center w-full h-full rounded-full\",\n \"border-2 border-dashed border-white/50 opacity-50\",\n )}\n >\n {name?.slice(0, 1)}\n </span>\n )}\n </span>\n );\n});\n","import { ReactNode } from \"react\";\nimport { usePreloadImage } from \"../../usePreloadImage\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n url: string | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport function PreloadedImage({ url, fallback, className }: Props) {\n const { isSuccess, isLoading } = usePreloadImage(url);\n // TODO: center object + fallback\n // TODO: fade in?\n return (\n <span className={twMerge(\"inline-flex w-full h-full items-center justify-center overflow-clip\", className)}>\n {!isLoading ? isSuccess ? <img src={url} className=\"w-full h-full object-cover\" /> : fallback : null}\n </span>\n );\n}\n","import {\n RelayChain,\n MAINNET_RELAY_API,\n TESTNET_RELAY_API,\n fetchChainConfigs,\n RelayClient,\n createClient,\n LogLevel,\n} from \"@reservoir0x/relay-sdk\";\nimport { UseQueryResult, useQuery } from \"@tanstack/react-query\";\nimport { debug } from \"../../debug\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\n\nexport function useRelay(): UseQueryResult<{ client: RelayClient; chains: RelayChain[] }> {\n const { chain } = useEntryKitConfig();\n const appOrigin = location.host;\n const baseApiUrl = chain.testnet ? TESTNET_RELAY_API : MAINNET_RELAY_API;\n\n return useQuery({\n queryKey: [\"relayChains\", baseApiUrl, appOrigin],\n queryFn: async () => {\n debug(\"fetching relay chains from\", baseApiUrl);\n const chains = await fetchChainConfigs(baseApiUrl);\n\n debug(\"got relay chains\", chains);\n const client = createClient({\n baseApiUrl,\n source: appOrigin,\n chains,\n logLevel: LogLevel.Verbose,\n });\n return { client, chains };\n },\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n staleTime: Infinity,\n });\n}\n","import { useAccount, useConfig as useWagmiConfig } from \"wagmi\";\nimport { getBalance } from \"wagmi/actions\";\nimport { useQuery, skipToken } from \"@tanstack/react-query\";\nimport { isNotNull } from \"@latticexyz/common/utils\";\nimport { ChainWithRelay } from \"./ChainSelect\";\n\ntype Props = {\n chains: ChainWithRelay[];\n};\n\nexport function useChainBalances({ chains }: Props) {\n const { address: userAddress } = useAccount();\n const wagmiConfig = useWagmiConfig();\n const chainIds = chains.map((chain) => chain.id);\n\n return useQuery({\n queryKey: [\"chainBalances\", chainIds, userAddress],\n queryFn: userAddress\n ? async () => {\n const chainBalances = await Promise.allSettled(\n chains.map(async (chain) => {\n const balance = await getBalance(wagmiConfig, { chainId: chain.id, address: userAddress });\n return { chain, balance };\n }),\n );\n\n return chainBalances.map((result) => (result.status === \"fulfilled\" ? result.value : null)).filter(isNotNull);\n }\n : skipToken,\n refetchInterval: 1000 * 60,\n retry: 1,\n });\n}\n","import { formatEther, parseEther } from \"viem\";\nimport { Input } from \"../../ui/Input\";\nimport { twMerge } from \"tailwind-merge\";\nimport { forwardRef } from \"react\";\nimport { EthIcon } from \"../../icons/EthIcon\";\n\nexport type Props = {\n initialAmount: bigint | undefined;\n onChange: (value: bigint | undefined) => void;\n};\n\nexport const AmountInput = forwardRef<HTMLInputElement, Props>(function AmountInput(\n { initialAmount, onChange },\n forwardedRef,\n) {\n return (\n <Input asChild className=\"w-full cursor-text flex items-center\">\n <label>\n <input\n ref={forwardedRef}\n className={twMerge(\"peer flex-grow outline-none bg-transparent\", \"placeholder:text-neutral-500\")}\n placeholder=\"0.005\"\n required\n autoFocus\n defaultValue={initialAmount == null ? \"\" : formatEther(initialAmount)}\n onChange={(event) => {\n const input = event.currentTarget;\n if (input.value.trim() === \"\") {\n input.setCustomValidity(\"\");\n onChange(undefined);\n return;\n }\n\n const value = input.value.trim().replace(/\\.$/, \".0\");\n if (!/^\\d*(\\.\\d+)?$/.test(value)) {\n return input.setCustomValidity(\"Invalid amount.\");\n }\n\n input.setCustomValidity(\"\");\n onChange(parseEther(value));\n }}\n />\n <span className={twMerge(\"flex-shrink-0 text-2xl\", \"peer-placeholder-shown:text-neutral-500\")}>\n <EthIcon />\n </span>\n </label>\n </Input>\n );\n});\n","import { useAccount, useBalance, useSwitchChain } from \"wagmi\";\nimport { Button, type Props as ButtonProps } from \"../../ui/Button\";\nimport { twMerge } from \"tailwind-merge\";\nimport { parseEther } from \"viem\";\n\nexport type Props = Omit<ButtonProps, \"type\"> & {\n amount?: bigint | undefined;\n chainId?: number | undefined;\n};\n\nconst MAX_DEPOSIT_AMOUNT = \"0.1\";\n\nexport function SubmitButton({ amount, chainId, className, ...buttonProps }: Props) {\n const { chainId: userChainId, address: userAddress } = useAccount();\n const { data: userBalance } = useBalance({ address: userAddress });\n const shouldSwitchChain = chainId != null && chainId !== userChainId;\n const switchChain = useSwitchChain();\n\n if (shouldSwitchChain) {\n return (\n <Button\n type=\"button\"\n variant=\"primary\"\n className={twMerge(\"w-full\", className)}\n pending={switchChain.isPending}\n onClick={() => switchChain.switchChain({ chainId })}\n >\n Switch chain\n </Button>\n );\n } else if (amount) {\n if (amount > parseEther(MAX_DEPOSIT_AMOUNT)) {\n return (\n <Button type=\"button\" className={twMerge(\"w-full\", className)} disabled>\n Max amount is {MAX_DEPOSIT_AMOUNT} ETH\n </Button>\n );\n } else if (amount > (userBalance?.value ?? 0n)) {\n return (\n <Button type=\"button\" className={twMerge(\"w-full\", className)} disabled>\n Insufficient balance\n </Button>\n );\n }\n }\n\n return <Button type=\"submit\" className={twMerge(\"w-full\", className)} {...buttonProps} />;\n}\n","/* eslint-disable max-len */\nimport { IconSVG, Props } from \"./IconSVG\";\n\nexport function WarningIcon(props: Props) {\n return (\n <IconSVG fill=\"none\" {...props}>\n <path\n d=\"M12 9V11M12 15H12.01M5.07183 19H18.9282C20.4678 19 21.4301 17.3333 20.6603 16L13.7321 4C12.9623 2.66667 11.0378 2.66667 10.268 4L3.33978 16C2.56998 17.3333 3.53223 19 5.07183 19Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { formatGwei } from \"viem\";\n\nexport function formatGas(wei: bigint) {\n // TODO: should this support non-ether decimals?\n const formatted = formatGwei(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 { Hex, TransactionReceipt } from \"viem\";\nimport { createStore } from \"zustand/vanilla\";\nimport { useStore } from \"zustand\";\nimport { useCallback, useMemo } from \"react\";\n\nexport type DepositBase = {\n readonly type: \"transfer\" | \"relay\";\n readonly amount: bigint;\n readonly chainL1Id: number;\n readonly chainL2Id: number;\n readonly start: Date;\n readonly estimatedTime: number;\n readonly isComplete: Promise<void>;\n};\n\nexport type TransferDeposit = Omit<DepositBase, \"type\"> & {\n readonly type: \"transfer\";\n readonly hash: Hex;\n readonly receipt: Promise<TransactionReceipt>;\n};\n\nexport type RelayDeposit = Omit<DepositBase, \"type\"> & {\n readonly type: \"relay\";\n readonly requestId: string;\n readonly depositPromise: Promise<unknown>;\n};\n\nexport type Deposit = DepositBase & (TransferDeposit | RelayDeposit);\n\nconst store = createStore<{\n readonly count: number;\n readonly deposits: readonly (Deposit & { readonly uid: string })[];\n}>(() => ({\n count: 0,\n deposits: [],\n}));\n\nexport function useDeposits() {\n const deposits = useStore(store, (state) => state.deposits);\n const addDeposit = useCallback((transaction: Deposit) => {\n store.setState((state) => {\n if (transaction.type === \"relay\") {\n const existingDeposit = state.deposits.find(\n (deposit) => deposit.type === \"relay\" && deposit.requestId === transaction.requestId,\n );\n\n if (existingDeposit) {\n return state;\n }\n }\n\n return {\n count: state.count + 1,\n deposits: [\n ...state.deposits,\n {\n ...transaction,\n uid: `deposit-${state.count}`,\n },\n ],\n };\n });\n }, []);\n\n const removeDeposit = useCallback((uid: string) => {\n store.setState((state) => ({\n deposits: state.deposits.filter((deposit) => deposit.uid !== uid),\n }));\n }, []);\n\n return useMemo(\n () => ({\n deposits,\n addDeposit,\n removeDeposit,\n }),\n [addDeposit, deposits, removeDeposit],\n );\n}\n","import { Chain, encodeFunctionData } from \"viem\";\nimport { useAccount, useWalletClient } from \"wagmi\";\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { Execute } from \"@reservoir0x/relay-sdk\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { DepositForm } from \"./DepositForm\";\nimport { useRelay } from \"./useRelay\";\nimport { useDeposits } from \"./useDeposits\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../../getPaymaster\";\nimport { paymasterAbi } from \"../../quarry/common\";\n\nconst ETH_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\ntype Props = {\n amount: bigint | undefined;\n setAmount: (amount: bigint | undefined) => void;\n sourceChain: Chain;\n setSourceChainId: (chainId: number) => void;\n};\n\nexport function DepositViaRelayForm({ amount, setAmount, sourceChain, setSourceChainId }: Props) {\n const { chain, chainId: destinationChainId } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\n const { data: wallet } = useWalletClient();\n const { address: userAddress } = useAccount();\n const { addDeposit } = useDeposits();\n const { data: relay } = useRelay();\n const relayClient = relay?.client;\n\n const quote = useQuery<Execute>({\n queryKey: [\"relayBridgeQuote\", sourceChain.id, amount?.toString()],\n queryFn: async () => {\n if (!relayClient) throw new Error(\"No Relay client found.\");\n if (!userAddress) throw new Error(\"No user address found.\");\n\n const result = await relayClient.actions.getQuote({\n chainId: sourceChain.id,\n toChainId: destinationChainId,\n currency: ETH_ADDRESS,\n toCurrency: ETH_ADDRESS,\n amount: amount?.toString(),\n tradeType: \"EXACT_OUTPUT\",\n recipient: paymaster?.address,\n wallet,\n txs: [\n {\n to: paymaster?.address,\n data: encodeFunctionData({\n abi: paymasterAbi,\n functionName: \"depositTo\",\n args: [userAddress],\n }),\n value: amount?.toString(),\n },\n ],\n });\n\n if (!result) {\n throw new Error(\"Failed to get relay quote\");\n }\n\n return result as Execute;\n },\n retry: 1,\n refetchInterval: 15_000,\n enabled: !!amount && !!userAddress && !!relayClient,\n });\n\n const deposit = useMutation({\n mutationKey: [\"depositViaRelay\", sourceChain.id, amount?.toString()],\n mutationFn: async ({ quote, amount }: { quote: Execute; amount: bigint }) => {\n if (!relayClient) throw new Error(\"No Relay client found.\");\n if (!wallet) throw new Error(\"No wallet found.\");\n\n try {\n return new Promise((resolve) => {\n const pendingDeposit = relayClient.actions.execute({\n quote,\n wallet,\n onProgress(progress) {\n const currentStep = progress.currentStep;\n const requestId = currentStep?.requestId;\n const currentState = currentStep?.items[0]?.progressState;\n\n if (requestId && currentState === \"validating\") {\n addDeposit({\n type: \"relay\",\n requestId,\n amount,\n chainL1Id: sourceChain.id,\n chainL2Id: destinationChainId,\n start: new Date(),\n estimatedTime: 1000 * 30,\n depositPromise: pendingDeposit,\n isComplete: pendingDeposit.then(() => undefined),\n });\n resolve(undefined);\n }\n },\n });\n });\n } catch (error) {\n console.error(\"Error while depositing via Relay\", error);\n throw error;\n }\n },\n });\n\n const fees = quote.data?.fees;\n const gasFee = BigInt(fees?.gas?.amount ?? 0);\n const relayerFee = BigInt(fees?.relayer?.amount ?? 0);\n const fee = gasFee + relayerFee;\n return (\n <DepositForm\n sourceChain={sourceChain}\n setSourceChainId={setSourceChainId}\n amount={amount}\n setAmount={setAmount}\n estimatedFee={{\n fee: fee != null ? BigInt(fee) : undefined,\n isLoading: quote.isLoading,\n error: quote.error instanceof Error ? quote.error : undefined,\n }}\n estimatedTime={\"A few seconds\"}\n onSubmit={async () => {\n if (!quote.data || !amount) return;\n await deposit.mutateAsync({ quote: quote.data, amount });\n }}\n submitButton={\n <SubmitButton\n variant=\"primary\"\n amount={amount}\n chainId={sourceChain.id}\n disabled={quote.isError || !amount}\n pending={deposit.isPending}\n >\n Deposit\n </SubmitButton>\n }\n />\n );\n}\n","import { useEffect } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { TransferDepositStatus } from \"./TransferDepositStatus\";\nimport { RelayDepositStatus } from \"./RelayDepositStatus\";\nimport { useDeposits } from \"./useDeposits\";\nimport { useAccount, useClient } from \"wagmi\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\n\nexport function Deposits() {\n const queryClient = useQueryClient();\n const { chainId } = useEntryKitConfig();\n const client = useClient({ chainId });\n const { address: userAddress } = useAccount();\n const { deposits, removeDeposit } = useDeposits();\n const { data: isComplete } = useQuery({\n queryKey: [\"depositsComplete\", deposits.map((deposit) => deposit.uid)],\n queryFn: async () => {\n if (!deposits.length) return false;\n await Promise.all(deposits.map((deposit) => deposit.isComplete));\n return true;\n },\n });\n\n useEffect(() => {\n if (isComplete) {\n queryClient.invalidateQueries({ queryKey: [\"balance\"] });\n queryClient.invalidateQueries({ queryKey: [\"getBalance\", client?.uid, userAddress] });\n }\n }, [client?.uid, isComplete, queryClient, userAddress]);\n\n if (!deposits.length) return null;\n\n return (\n <div className=\"flex flex-col gap-1 mt-4\">\n {deposits.map((deposit) => {\n if (deposit.type === \"transfer\") {\n return <TransferDepositStatus key={deposit.uid} {...deposit} onDismiss={() => removeDeposit(deposit.uid)} />;\n } else if (deposit.type === \"relay\") {\n return <RelayDepositStatus key={deposit.uid} {...deposit} onDismiss={() => removeDeposit(deposit.uid)} />;\n }\n })}\n </div>\n );\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { DepositStatus } from \"./DepositStatus\";\nimport { useChains } from \"wagmi\";\nimport { TransferDeposit } from \"./useDeposits\";\nimport { Balance } from \"../../ui/Balance\";\n\nexport type Props = TransferDeposit & { onDismiss: () => void };\n\nexport function TransferDepositStatus({\n amount,\n chainL1Id,\n hash,\n receipt: receiptPromise,\n start,\n estimatedTime,\n onDismiss,\n}: Props) {\n const chains = useChains();\n const chain = chains.find((chain) => chain.id === chainL1Id)!;\n\n const receipt = useQuery({\n queryKey: [\"transferDepositStatus\", hash],\n queryFn: () => receiptPromise,\n });\n\n return (\n <DepositStatus\n status={receipt.status}\n progress={{\n duration: estimatedTime,\n elapsed: Math.min(estimatedTime, Date.now() - start.getTime()),\n }}\n onDismiss={onDismiss}\n >\n {(() => {\n const blockExplorer = chain.blockExplorers?.default.url;\n if (receipt.status === \"pending\") {\n return (\n <>\n Confirming deposit on{\" \"}\n <a\n href={blockExplorer ? `${blockExplorer}/tx/${hash}` : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {chain.name}\n </a>\n …\n </>\n );\n }\n if (receipt.status === \"error\") {\n return (\n <>\n Could not find deposit on{\" \"}\n <a\n href={blockExplorer ? `${blockExplorer}/tx/${hash}` : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {chain.name}\n </a>\n .\n </>\n );\n }\n return (\n <>\n Successfully{\" \"}\n <a\n href={blockExplorer ? `${blockExplorer}/tx/${receipt.data.transactionHash}` : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n deposited\n </a>{\" \"}\n <Balance wei={amount} />\n </>\n );\n })()}\n </DepositStatus>\n );\n}\n","import { PendingIcon } from \"../../icons/PendingIcon\";\nimport { ReactNode, useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CheckIcon } from \"../../icons/CheckIcon\";\nimport { WarningIcon } from \"../../icons/WarningIcon\";\nimport { CloseIcon } from \"../../icons/CloseIcon\";\n\nexport type Props = {\n status: \"pending\" | \"success\" | \"error\";\n progress: {\n duration: number;\n elapsed: number;\n };\n onDismiss: () => void;\n children: ReactNode;\n};\n\nexport function DepositStatus({ status, progress, children, onDismiss }: Props) {\n const [appear, setAppear] = useState(false);\n useEffect(() => {\n setAppear(true);\n }, []);\n\n return (\n <div className=\"group bg-neutral-900 flex flex-col animate-in fade-in slide-in-from-bottom-2 animate-out fade-out\">\n <div className=\"py-1 text-sm flex items-center gap-2\">\n <div className=\"flex-grow\">{children}</div>\n <div className=\"flex-shrink-0 grid\">\n <span className=\"col-start-1 row-start-1 transition opacity-100 group-hover:opacity-0 group-hover:pointer-events-none\">\n {status === \"success\" ? (\n <CheckIcon className=\"text-green-600\" />\n ) : status === \"error\" ? (\n <WarningIcon className=\"text-amber-500\" />\n ) : (\n <PendingIcon className=\"text-neutral-500 transition\" />\n )}\n </span>\n <button\n type=\"button\"\n className={twMerge(\n \"col-start-1 row-start-1 flex items-center justify-center transition\",\n \"opacity-0 pointer-events-none\",\n \"group-hover:opacity-100 group-hover:pointer-events-auto\",\n \"text-neutral-500 hover:text-white\",\n )}\n title=\"Dismiss\"\n onClick={onDismiss}\n >\n <CloseIcon />\n </button>\n </div>\n </div>\n\n <div className=\"w-full h-[2px] -mt-full overflow-clip\">\n <div\n className={twMerge(\n \"w-full h-full transition ease-linear\",\n status === \"success\" ? \"bg-green-600\" : status === \"error\" ? \"bg-red-600\" : \"bg-blue-600\",\n status === \"pending\" ? \"opacity-100\" : \"opacity-0\",\n )}\n style={\n status === \"pending\"\n ? {\n transform: appear ? `translateX(0)` : \"translate(-100%)\",\n transitionDuration: `${progress.duration}ms`,\n transitionDelay: `-${Math.min(progress.duration, progress.elapsed)}ms`,\n }\n : undefined\n }\n />\n </div>\n </div>\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 { useQuery } from \"@tanstack/react-query\";\nimport { DepositStatus } from \"./DepositStatus\";\nimport { useChains } from \"wagmi\";\nimport { RelayDeposit } from \"./useDeposits\";\nimport { Balance } from \"../../ui/Balance\";\n\nexport type Props = RelayDeposit & { onDismiss: () => void };\n\nexport function RelayDepositStatus({\n amount,\n chainL1Id,\n chainL2Id,\n start,\n estimatedTime,\n depositPromise,\n onDismiss,\n}: Props) {\n const chains = useChains();\n const chainL1 = chains.find((chain) => chain.id === chainL1Id)!;\n const chainL2 = chains.find((chain) => chain.id === chainL2Id)!;\n\n const deposit = useQuery({\n queryKey: [\"relayDepositPromise\", chainL1Id, chainL2Id, amount.toString(), start.toISOString()],\n queryFn: () => depositPromise,\n });\n\n return (\n <DepositStatus\n status={deposit.status}\n progress={{\n duration: estimatedTime,\n elapsed: Math.min(estimatedTime, Date.now() - start.getTime()),\n }}\n onDismiss={onDismiss}\n >\n {(() => {\n // const blockExplorerL1 = chainL1.blockExplorers?.default.url;\n // const blockExplorerL2 = chainL2.blockExplorers?.default.url;\n if (deposit.status === \"pending\") {\n // TODO: link to block explorer once we get a tx hash\n return <>Relay bridge deposit pending on {chainL1.name}…</>;\n }\n if (deposit.status === \"error\") {\n return <>Relay bridge deposit to {chainL2.name} failed.</>;\n }\n return (\n <>\n Successfully bridged <Balance wei={amount} /> to {chainL2.name}!\n </>\n );\n })()}\n </DepositStatus>\n );\n}\n","import { IconSVG, Props } from \"./IconSVG\";\n\nexport function ArrowLeftIcon(props: Props) {\n return (\n <IconSVG {...props}>\n <path\n d=\"M19 12H5M12 19l-7-7 7-7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { Address } from \"viem\";\nimport { getAction } from \"viem/utils\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\nimport { useAccount, useClient, useSwitchChain, useWriteContract } from \"wagmi\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPaymaster } from \"../../getPaymaster\";\nimport { paymasterAbi } from \"../../quarry/common\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useBalance } from \"./useBalance\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\n\nexport type Props = {\n userAddress: Address;\n};\n\nexport function WithdrawGasBalanceButton({ userAddress }: Props) {\n const { writeContractAsync } = useWriteContract();\n const { switchChain } = useSwitchChain();\n const { chain, chainId } = useEntryKitConfig();\n const { chainId: userChainId } = useAccount();\n const queryClient = useQueryClient();\n const client = useClient({ chainId });\n const paymaster = getPaymaster(chain);\n const balance = useShowQueryError(useBalance(userAddress));\n const shouldSwitchChain = chainId != null && chainId !== userChainId;\n\n const withdraw = useMutation({\n mutationKey: [\"withdraw\", userAddress],\n mutationFn: async () => {\n if (!client) throw new Error(\"Client not ready.\");\n if (!paymaster) throw new Error(\"Paymaster not found\");\n if (!balance.data) throw new Error(\"No gas balance to withdraw.\");\n\n try {\n const hash = await writeContractAsync({\n address: paymaster.address,\n abi: paymasterAbi,\n functionName: \"withdrawTo\",\n args: [userAddress, balance.data],\n chainId,\n });\n await getAction(client, waitForTransactionReceipt, \"waitForTransactionReceipt\")({ hash });\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"balance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n } catch (error) {\n console.error(\"Error while withdrawing\", error);\n throw error;\n }\n },\n });\n\n if (balance.data == null || balance.data === 0n) {\n return null;\n }\n\n return (\n <button\n onClick={() => {\n if (shouldSwitchChain) {\n return switchChain({ chainId });\n }\n withdraw.mutate();\n }}\n className={twMerge(\n \"text-sm font-medium text-white/50 group whitespace-nowrap\",\n withdraw.isPending ? \"opacity-50 pointer-events-none\" : \"cursor-pointer hover:text-white\",\n )}\n disabled={withdraw.isPending}\n >\n <span className=\"inline-block\">\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 underline decoration-neutral-500 underline-offset-4\",\n !withdraw.isPending && \"hover:decoration-orange-500\",\n shouldSwitchChain && \"group-hover:hidden\",\n )}\n >\n {withdraw.isPending && <PendingIcon className=\"w-3 h-3\" />}\n Withdraw\n </span>\n\n {shouldSwitchChain && (\n <span className=\"hidden group-hover:inline-block underline decoration-neutral-500 underline-offset-4 hover:decoration-orange-500\">\n Switch chain\n </span>\n )}\n </span>\n </button>\n );\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { requestAllowance } from \"../../quarry/requestAllowance\";\n\nexport function useRequestAllowance() {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n\n const mutationKey = [\"requestAllowance\", chain.id];\n return useMutation({\n retry: 0,\n mutationKey,\n mutationFn: async (userAddress: Address) => {\n await requestAllowance({ chain, userAddress });\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getAllowance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getFunds\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n });\n}\n","import { Address, EIP1193RequestFn, Transport, http } from \"viem\";\n\nexport type QuarrySponsorRpcSchema = [\n {\n Method: \"sponsor_requestAllowance\";\n Parameters: [receiver: Address];\n ReturnType: { message: string };\n },\n];\n\nexport function quarrySponsor(): Transport<\"http\", {}, EIP1193RequestFn<QuarrySponsorRpcSchema>> {\n return ({ chain }) => {\n if (!chain) throw new Error(\"No chain provided to quarrySponsor transport.\");\n\n const url = \"quarrySponsor\" in chain.rpcUrls ? chain.rpcUrls.quarrySponsor.http[0] : undefined;\n // TODO: add fallback for anvil to do what quarrySponsor does internally\n if (!url) throw new Error(`No \\`quarrySponsor\\` RPC URL found for chain ${chain.id}.`);\n\n return http(url)({ chain, retryCount: 0 });\n };\n}\n","import { Address, Chain } from \"viem\";\nimport { quarrySponsor } from \"./transports/quarrySponsor\";\nimport { debug } from \"./debug\";\n\nexport async function requestAllowance({ chain, userAddress }: { chain: Chain; userAddress: Address }) {\n const transport = quarrySponsor()({ chain });\n\n debug(\"Requesting allowance for\", userAddress);\n await transport.request({\n method: \"sponsor_requestAllowance\",\n params: [userAddress],\n });\n}\n","import { wait } from \"@latticexyz/common/utils\";\nimport { useEffect } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n error?: Error;\n dismiss?: () => unknown;\n retry?: () => unknown | Promise<unknown>;\n};\n\nexport function ErrorOverlay({ error, retry, dismiss }: Props) {\n useEffect(() => {\n if (error) {\n console.error(error);\n }\n }, [error]);\n\n return (\n <div className=\"pointer-events-none absolute inset-0 overflow-clip\">\n <div\n className={twMerge(\n \"absolute inset-0 bg-blue-700/60\",\n \"transition duration-300\",\n error ? \"opacity-100 pointer-events-auto\" : \"opacity-0\",\n )}\n />\n <div\n className={twMerge(\n \"absolute inset-0 pb-8\",\n \"transition duration-300\",\n error ? \"translate-y-0 opacity-100 pointer-events-auto\" : \"-translate-y-4 opacity-0\",\n )}\n >\n {error ? (\n <>\n <div className=\"w-full max-h-full bg-blue-700 text-white/80 overflow-auto\">\n <div className=\"space-y-6 px-8 pt-8\">\n <div className=\"text-white text-lg font-bold\">Oops! It broke :(</div>\n <div className=\"font-mono text-xs whitespace-pre-wrap\">{error.message.trim()}</div>\n <div className=\"text-sm\">See the console for more info.</div>\n </div>\n <div className=\"pointer-events-none sticky bottom-0 left-0 -mt-2\">\n <div className=\"w-full h-12 bg-gradient-to-b from-transparent to-blue-700\" />\n {retry ? (\n <div className=\"bg-blue-700 text-center\">\n {/* TODO: replace with AsyncButton */}\n <button\n type=\"button\"\n className={twMerge(\n \"pointer-events-auto group w-24 p-1 -translate-y-2 transition\",\n \"bg-blue-600 hover:bg-blue-500 aria-busy:bg-blue-500\",\n \"text-white text-sm font-medium\",\n \"aria-busy:pointer-events-none\",\n )}\n onClick={async (event) => {\n // if we retry and the same error occurs, it'll look like the button click did nothing\n // so we'll fake a pending state here to give users an indication something is happening\n event.currentTarget.ariaBusy = \"true\";\n await wait(500);\n retry();\n if (event.currentTarget) {\n event.currentTarget.ariaBusy = null;\n }\n }}\n >\n {/* TODO: swap with pending icon */}\n <span className=\"group-aria-busy:hidden\">Retry</span>\n <span className=\"hidden group-aria-busy:inline\">Retrying…</span>\n </button>\n </div>\n ) : dismiss ? (\n <div className=\"bg-blue-700 text-center\">\n {/* TODO: replace with AsyncButton */}\n <button\n type=\"button\"\n className={twMerge(\n \"pointer-events-auto group w-24 p-1 -translate-y-2 transition\",\n \"bg-blue-600 hover:bg-blue-500 aria-busy:bg-blue-500\",\n \"text-white text-sm font-medium\",\n \"aria-busy:pointer-events-none\",\n )}\n onClick={dismiss}\n >\n Dismiss\n </button>\n </div>\n ) : null}\n </div>\n </div>\n </>\n ) : null}\n </div>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { FallbackProps } from \"react-error-boundary\";\nimport { ErrorOverlay } from \"./ErrorOverlay\";\n\nexport type Props = {\n children: ReactNode;\n};\n\nexport function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {\n return (\n <div className=\"h-64\">\n <ErrorOverlay error={error} retry={resetErrorBoundary} />\n </div>\n );\n}\n","import { useStore } from \"zustand\";\nimport { store } from \"./store\";\nimport { ErrorOverlay } from \"./ErrorOverlay\";\n\nexport function ErrorsOverlay() {\n const error = useStore(store, (state) => state.errors.at(0));\n return <ErrorOverlay error={error?.error} retry={error?.retry} dismiss={error?.dismiss} />;\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 || prereqs.isPending}\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 (!prerequisites.isSuccess || !prerequisites.data.complete) {\n return { ...prerequisites, data: undefined } as never;\n }\n\n return sessionClient;\n}\n","import { Chain, Transport } from \"viem\";\nimport { Config, CreateConfigParameters, CreateConnectorFn, createConfig } from \"wagmi\";\nimport { getDefaultConfig } from \"connectkit\";\nimport { getDefaultConnectors } from \"./getDefaultConnectors\";\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 connectorFns extends readonly CreateConnectorFn[] = readonly CreateConnectorFn[],\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, connectorFns>, \"pollingInterval\" | \"connectors\">;\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n const connectorFns extends readonly CreateConnectorFn[] = readonly CreateConnectorFn[],\n>(config: CreateWagmiConfigOptions<chains, transports, connectorFns>): Config<chains, transports, connectorFns> {\n const connectors = config.connectors ?? getDefaultConnectors(config);\n\n const configParams = getDefaultConfig({\n chains: config.chains,\n transports: config.transports,\n pollingInterval: config.pollingInterval,\n appName: config.appName,\n walletConnectProjectId: config.walletConnectProjectId,\n enableFamily: false,\n connectors,\n });\n\n return createConfig(configParams) as never;\n}\n","import { CreateConnectorFn } from \"wagmi\";\nimport { injected, coinbaseWallet, safe } from \"wagmi/connectors\";\nimport { walletConnect } from \"./connectors/walletConnect\";\n\nexport type GetDefaultConnectorsOptions = {\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};\n\nexport function getDefaultConnectors(config: GetDefaultConnectorsOptions): readonly CreateConnectorFn[] {\n // TODO: return ConnectKit's default connectors once https://github.com/wevm/wagmi/pull/4691 lands\n const connectors: CreateConnectorFn[] = [];\n\n // If we're in an iframe, include the SafeConnector\n const shouldUseSafeConnector = !(typeof window === \"undefined\") && window?.parent !== window;\n if (shouldUseSafeConnector) {\n connectors.push(\n safe({\n allowedDomains: [/gnosis-safe.io$/, /app.safe.global$/],\n }),\n );\n }\n\n connectors.push(\n injected({ target: \"metaMask\" }),\n coinbaseWallet({\n appName: config.appName,\n overrideIsMetaMask: false,\n }),\n );\n\n if (config.walletConnectProjectId) {\n connectors.push(\n walletConnect({\n showQrModal: false,\n projectId: config.walletConnectProjectId,\n }),\n );\n }\n\n return connectors;\n}\n","import { ChainNotConfiguredError, type Connector, ProviderNotFoundError, createConnector } from \"wagmi\";\nimport type { Chain, Transport } from \"viem\";\nimport type { EthereumProvider } from \"@walletconnect/ethereum-provider\";\nimport {\n type AddEthereumChainParameter,\n type Address,\n type ProviderConnectInfo,\n type ProviderRpcError,\n type RpcError,\n SwitchChainError,\n UserRejectedRequestError,\n getAddress,\n numberToHex,\n} from \"viem\";\n\n// This is a fork of wagmi's WalletConnect connector and adjusts when the `switchChain` call is made\n// TODO: remove once https://github.com/wevm/wagmi/pull/4691 lands\n\ntype WalletConnectConnector = Connector & {\n onDisplayUri(uri: string): void;\n onSessionDelete(data: { topic: string }): void;\n};\n\ntype EthereumProviderOptions = Parameters<(typeof EthereumProvider)[\"init\"]>[0];\n\n// TODO: export from wagmi?\ntype Compute<type> = { [key in keyof type]: type[key] } & unknown;\ntype ExactPartial<type> = { [key in keyof type]?: type[key] | undefined };\ntype StrictOmit<type, keys extends keyof type> = Pick<type, Exclude<keyof type, keys>>;\n\nexport type WalletConnectParameters = Compute<\n {\n /**\n * If a new chain is added to a previously existing configured connector `chains`, this flag\n * will determine if that chain should be considered as stale. A stale chain is a chain that\n * WalletConnect has yet to establish a relationship with (e.g. the user has not approved or\n * rejected the chain).\n *\n * This flag mainly affects the behavior when a wallet does not support dynamic chain authorization\n * with WalletConnect v2.\n *\n * If `true` (default), the new chain will be treated as a stale chain. If the user\n * has yet to establish a relationship (approved/rejected) with this chain in their WalletConnect\n * session, the connector will disconnect upon the dapp auto-connecting, and the user will have to\n * reconnect to the dapp (revalidate the chain) in order to approve the newly added chain.\n * This is the default behavior to avoid an unexpected error upon switching chains which may\n * be a confusing user experience (e.g. the user will not know they have to reconnect\n * unless the dapp handles these types of errors).\n *\n * If `false`, the new chain will be treated as a potentially valid chain. This means that if the user\n * has yet to establish a relationship with the chain in their WalletConnect session, wagmi will successfully\n * auto-connect the user. This comes with the trade-off that the connector will throw an error\n * when attempting to switch to the unapproved chain if the wallet does not support dynamic session updates.\n * This may be useful in cases where a dapp constantly\n * modifies their configured chains, and they do not want to disconnect the user upon\n * auto-connecting. If the user decides to switch to the unapproved chain, it is important that the\n * dapp handles this error and prompts the user to reconnect to the dapp in order to approve\n * the newly added chain.\n *\n * @default true\n */\n isNewChainsStale?: boolean;\n } & StrictOmit<\n EthereumProviderOptions,\n \"chains\" | \"events\" | \"optionalChains\" | \"optionalEvents\" | \"optionalMethods\" | \"methods\" | \"rpcMap\" | \"showQrModal\"\n > &\n ExactPartial<Pick<EthereumProviderOptions, \"showQrModal\">>\n>;\n\nwalletConnect.type = \"walletConnect\" as const;\nexport function walletConnect(parameters: WalletConnectParameters) {\n const isNewChainsStale = parameters.isNewChainsStale ?? true;\n\n type Provider = Awaited<ReturnType<(typeof EthereumProvider)[\"init\"]>>;\n type Properties = {\n connect(parameters?: {\n chainId?: number | undefined;\n isReconnecting?: boolean | undefined;\n pairingTopic?: string | undefined;\n }): Promise<{\n accounts: readonly Address[];\n chainId: number;\n }>;\n getNamespaceChainsIds(): number[];\n getRequestedChainsIds(): Promise<number[]>;\n isChainsStale(): Promise<boolean>;\n onConnect(connectInfo: ProviderConnectInfo): void;\n onDisplayUri(uri: string): void;\n onSessionDelete(data: { topic: string }): void;\n setRequestedChainsIds(chains: number[]): void;\n requestedChainsStorageKey: `${string}.requestedChains`;\n };\n type StorageItem = {\n [_ in Properties[\"requestedChainsStorageKey\"]]: number[];\n };\n\n let provider_: Provider | undefined;\n let providerPromise: Promise<typeof provider_>;\n const NAMESPACE = \"eip155\";\n\n let accountsChanged: WalletConnectConnector[\"onAccountsChanged\"] | undefined;\n let chainChanged: WalletConnectConnector[\"onChainChanged\"] | undefined;\n let connect: WalletConnectConnector[\"onConnect\"] | undefined;\n let displayUri: WalletConnectConnector[\"onDisplayUri\"] | undefined;\n let sessionDelete: WalletConnectConnector[\"onSessionDelete\"] | undefined;\n let disconnect: WalletConnectConnector[\"onDisconnect\"] | undefined;\n\n return createConnector<Provider, Properties, StorageItem>((config) => ({\n id: \"walletConnect\",\n name: \"WalletConnect\",\n type: walletConnect.type,\n async setup() {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return;\n if (!connect) {\n connect = this.onConnect.bind(this);\n provider.on(\"connect\", connect);\n }\n if (!sessionDelete) {\n sessionDelete = this.onSessionDelete.bind(this);\n provider.on(\"session_delete\", sessionDelete);\n }\n },\n async connect({ chainId, ...rest } = {}) {\n try {\n const provider = await this.getProvider();\n if (!provider) throw new ProviderNotFoundError();\n if (!displayUri) {\n displayUri = this.onDisplayUri;\n provider.on(\"display_uri\", displayUri);\n }\n\n let targetChainId = chainId;\n if (!targetChainId) {\n const state = (await config.storage?.getItem(\"state\")) ?? {};\n const isChainSupported = config.chains.some((x) => x.id === state.chainId);\n if (isChainSupported) targetChainId = state.chainId;\n else targetChainId = config.chains[0]?.id;\n }\n if (!targetChainId) throw new Error(\"No chains found on connector.\");\n\n const isChainsStale = await this.isChainsStale();\n // If there is an active session with stale chains, disconnect current session.\n if (provider.session && isChainsStale) await provider.disconnect();\n\n // If there isn't an active session or chains are stale, connect.\n if (!provider.session || isChainsStale) {\n const optionalChains = config.chains\n .filter((chain) => chain.id !== targetChainId)\n .map((optionalChain) => optionalChain.id);\n await provider.connect({\n optionalChains: [targetChainId, ...optionalChains],\n ...(\"pairingTopic\" in rest ? { pairingTopic: rest.pairingTopic } : {}),\n });\n\n this.setRequestedChainsIds(config.chains.map((x) => x.id));\n }\n\n // If session exists and chains are authorized, enable provider for required chain\n const accounts = (await provider.enable()).map((x) => getAddress(x));\n\n // Switch to chain if provided\n let currentChainId = await this.getChainId();\n if (chainId && currentChainId !== chainId) {\n const chain = await this.switchChain!({ chainId }).catch((error) => {\n if (error.code === UserRejectedRequestError.code) throw error;\n return { id: currentChainId };\n });\n currentChainId = chain?.id ?? currentChainId;\n }\n\n if (displayUri) {\n provider.removeListener(\"display_uri\", displayUri);\n displayUri = undefined;\n }\n if (connect) {\n provider.removeListener(\"connect\", connect);\n connect = undefined;\n }\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n provider.on(\"accountsChanged\", accountsChanged);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n provider.on(\"chainChanged\", chainChanged);\n }\n if (!disconnect) {\n disconnect = this.onDisconnect.bind(this);\n provider.on(\"disconnect\", disconnect);\n }\n if (!sessionDelete) {\n sessionDelete = this.onSessionDelete.bind(this);\n provider.on(\"session_delete\", sessionDelete);\n }\n\n return { accounts, chainId: currentChainId };\n } catch (error) {\n if (/(user rejected|connection request reset)/i.test((error as ProviderRpcError)?.message)) {\n throw new UserRejectedRequestError(error as Error);\n }\n throw error;\n }\n },\n async disconnect() {\n const provider = await this.getProvider();\n try {\n await provider?.disconnect();\n } catch (error) {\n if (!/No matching key/i.test((error as Error).message)) throw error;\n } finally {\n if (chainChanged) {\n provider?.removeListener(\"chainChanged\", chainChanged);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider?.removeListener(\"disconnect\", disconnect);\n disconnect = undefined;\n }\n if (!connect) {\n connect = this.onConnect.bind(this);\n provider?.on(\"connect\", connect);\n }\n if (accountsChanged) {\n provider?.removeListener(\"accountsChanged\", accountsChanged);\n accountsChanged = undefined;\n }\n if (sessionDelete) {\n provider?.removeListener(\"session_delete\", sessionDelete);\n sessionDelete = undefined;\n }\n\n this.setRequestedChainsIds([]);\n }\n },\n async getAccounts() {\n const provider = await this.getProvider();\n return provider.accounts.map((x) => getAddress(x));\n },\n async getProvider() {\n async function initProvider() {\n const optionalChains = config.chains.map((x) => x.id) as [number];\n if (!optionalChains.length) return;\n const { EthereumProvider } = await import(\"@walletconnect/ethereum-provider\");\n return await EthereumProvider.init({\n ...parameters,\n disableProviderPing: true,\n optionalChains,\n projectId: parameters.projectId,\n rpcMap: Object.fromEntries(\n config.chains.map((chain) => {\n const [url] = extractRpcUrls({\n chain,\n transports: config.transports,\n });\n return [chain.id, url];\n }),\n ),\n showQrModal: parameters.showQrModal ?? true,\n });\n }\n\n if (!provider_) {\n if (!providerPromise) providerPromise = initProvider();\n provider_ = await providerPromise;\n provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY);\n }\n return provider_!;\n },\n async getChainId() {\n const provider = await this.getProvider();\n return provider.chainId;\n },\n async isAuthorized() {\n try {\n const [accounts, provider] = await Promise.all([this.getAccounts(), this.getProvider()]);\n\n // If an account does not exist on the session, then the connector is unauthorized.\n if (!accounts.length) return false;\n\n // If the chains are stale on the session, then the connector is unauthorized.\n const isChainsStale = await this.isChainsStale();\n if (isChainsStale && provider.session) {\n await provider.disconnect().catch(() => {});\n return false;\n }\n return true;\n } catch {\n return false;\n }\n },\n async switchChain({ addEthereumChainParameter, chainId }) {\n const provider = await this.getProvider();\n if (!provider) throw new ProviderNotFoundError();\n\n const chain = config.chains.find((x) => x.id === chainId);\n if (!chain) throw new SwitchChainError(new ChainNotConfiguredError());\n\n try {\n await Promise.all([\n new Promise<void>((resolve) => {\n const listener = ({ chainId: currentChainId }: { chainId?: number | undefined }) => {\n if (currentChainId === chainId) {\n config.emitter.off(\"change\", listener);\n resolve();\n }\n };\n config.emitter.on(\"change\", listener);\n }),\n provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n }),\n ]);\n\n const requestedChains = await this.getRequestedChainsIds();\n this.setRequestedChainsIds([...requestedChains, chainId]);\n\n return chain;\n } catch (err) {\n const error = err as RpcError;\n\n if (/(user rejected)/i.test(error.message)) throw new UserRejectedRequestError(error);\n\n // Indicates chain is not added to provider\n try {\n let blockExplorerUrls: string[] | undefined;\n if (addEthereumChainParameter?.blockExplorerUrls)\n blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls;\n else blockExplorerUrls = chain.blockExplorers?.default.url ? [chain.blockExplorers?.default.url] : [];\n\n let rpcUrls: readonly string[];\n if (addEthereumChainParameter?.rpcUrls?.length) rpcUrls = addEthereumChainParameter.rpcUrls;\n else rpcUrls = [...chain.rpcUrls.default.http];\n\n const addEthereumChain = {\n blockExplorerUrls,\n chainId: numberToHex(chainId),\n chainName: addEthereumChainParameter?.chainName ?? chain.name,\n iconUrls: addEthereumChainParameter?.iconUrls,\n nativeCurrency: addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,\n rpcUrls,\n } satisfies AddEthereumChainParameter;\n\n await provider.request({\n method: \"wallet_addEthereumChain\",\n params: [addEthereumChain],\n });\n\n const requestedChains = await this.getRequestedChainsIds();\n this.setRequestedChainsIds([...requestedChains, chainId]);\n return chain;\n } catch (error) {\n throw new UserRejectedRequestError(error as Error);\n }\n }\n },\n onAccountsChanged(accounts) {\n if (accounts.length === 0) this.onDisconnect();\n else\n config.emitter.emit(\"change\", {\n accounts: accounts.map((x) => getAddress(x)),\n });\n },\n onChainChanged(chain) {\n const chainId = Number(chain);\n config.emitter.emit(\"change\", { chainId });\n },\n async onConnect(connectInfo) {\n const chainId = Number(connectInfo.chainId);\n const accounts = await this.getAccounts();\n config.emitter.emit(\"connect\", { accounts, chainId });\n },\n async onDisconnect(_error) {\n this.setRequestedChainsIds([]);\n config.emitter.emit(\"disconnect\");\n\n const provider = await this.getProvider();\n if (accountsChanged) {\n provider.removeListener(\"accountsChanged\", accountsChanged);\n accountsChanged = undefined;\n }\n if (chainChanged) {\n provider.removeListener(\"chainChanged\", chainChanged);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider.removeListener(\"disconnect\", disconnect);\n disconnect = undefined;\n }\n if (sessionDelete) {\n provider.removeListener(\"session_delete\", sessionDelete);\n sessionDelete = undefined;\n }\n if (!connect) {\n connect = this.onConnect.bind(this);\n provider.on(\"connect\", connect);\n }\n },\n onDisplayUri(uri) {\n config.emitter.emit(\"message\", { type: \"display_uri\", data: uri });\n },\n onSessionDelete() {\n this.onDisconnect();\n },\n getNamespaceChainsIds() {\n if (!provider_) return [];\n const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map((account) =>\n Number.parseInt(account.split(\":\")[1] || \"\"),\n );\n return chainIds ?? [];\n },\n async getRequestedChainsIds() {\n return (await config.storage?.getItem(this.requestedChainsStorageKey)) ?? [];\n },\n /**\n * Checks if the target chains match the chains that were\n * initially requested by the connector for the WalletConnect session.\n * If there is a mismatch, this means that the chains on the connector\n * are considered stale, and need to be revalidated at a later point (via\n * connection).\n *\n * There may be a scenario where a dapp adds a chain to the\n * connector later on, however, this chain will not have been approved or rejected\n * by the wallet. In this case, the chain is considered stale.\n */\n async isChainsStale() {\n if (!isNewChainsStale) return false;\n\n const connectorChains = config.chains.map((x) => x.id);\n const namespaceChains = this.getNamespaceChainsIds();\n if (namespaceChains.length && !namespaceChains.some((id) => connectorChains.includes(id))) return false;\n\n const requestedChains = await this.getRequestedChainsIds();\n return !connectorChains.every((id) => requestedChains.includes(id));\n },\n async setRequestedChainsIds(chains) {\n await config.storage?.setItem(this.requestedChainsStorageKey, chains);\n },\n get requestedChainsStorageKey() {\n return `${this.id}.requestedChains` as Properties[\"requestedChainsStorageKey\"];\n },\n }));\n}\n\ntype ExtractRpcUrlsParameters = {\n transports?: Record<string, Transport> | undefined;\n chain: Chain;\n};\n\nexport function extractRpcUrls(parameters: ExtractRpcUrlsParameters) {\n const { chain } = parameters;\n const fallbackUrl = chain.rpcUrls.default.http[0];\n\n if (!parameters.transports) return [fallbackUrl];\n\n const transport = parameters.transports?.[chain.id]?.({ chain });\n const transports = (transport?.value?.transports as NonNullable<typeof transport>[]) || [transport];\n return transports.map(({ value }) => value?.url || fallbackUrl);\n}\n","import { Chain, createClient, http } from \"viem\";\nimport { cachedFeesPerGas } from \"../actions/cachedFeesPerGas\";\n\ntype WithFeeCacheOptions = {\n refreshInterval?: number;\n};\n\nexport function withFeeCache<chain extends Chain>(\n chain: chain,\n options: WithFeeCacheOptions = { refreshInterval: 10_000 },\n): chain {\n if (chain.fees?.estimateFeesPerGas) {\n throw new Error(\"withFeeCache: estimateFeesPerGas already defined in chain config\");\n }\n\n const client = createClient({\n chain,\n transport: http(),\n });\n\n return {\n ...chain,\n fees: {\n ...chain.fees,\n estimateFeesPerGas: cachedFeesPerGas(client, options),\n },\n };\n}\n","import { Address, Client } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { getDelegation } from \"./onboarding/getDelegation\";\n\n/**\n * @internal\n */\nexport async function internal_validateSigner({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n signerAddress,\n}: {\n client: Client;\n worldAddress: Address;\n userAddress: Address;\n sessionAddress: Address;\n signerAddress: Address;\n}) {\n const ownerAddress = await readContract(client, {\n address: sessionAddress,\n abi: simpleAccountAbi,\n functionName: \"owner\",\n });\n\n if (ownerAddress.toLowerCase() !== signerAddress.toLowerCase()) {\n throw new Error(`Session account owner (${ownerAddress}) does not match message signer (${signerAddress}).`);\n }\n\n const hasDelegation = await getDelegation({\n client,\n worldAddress,\n sessionAddress,\n userAddress,\n blockTag: \"latest\",\n });\n\n if (!hasDelegation) {\n throw new Error(`Session account (${sessionAddress}) does not have delegation for user account (${userAddress}).`);\n }\n}\n\n// TODO: import ABI once we can get strongly typed JSON or expose `getOwner` or similar method on smart account\nconst simpleAccountAbi = [\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n"],"mappings":"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f;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,WAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,WAAa;AAAA,EAC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","names":["useEffect","createContext","useContext","entryPoint07Address","debug","debug","entryPoint07Address","log","jsx","Context","createContext","useContext","jsx","Shadow","jsx","jsxs","useEffect","twMerge","useAccount","twMerge","twMerge","jsx","jsxs","jsx","jsxs","twMerge","twMerge","jsx","jsxs","jsx","jsxs","twMerge","useEffect","useRef","jsx","jsxs","twMerge","error","useRef","useEffect","useEffect","useMemo","useRef","useState","twMerge","useClient","useConfig","queryOptions","useQuery","useQueryClient","useQuery","useClient","queryOptions","skipToken","useQuery","getRecord","parseAbi","getRecord","queryOptions","skipToken","useClient","queryOptions","skipToken","useQuery","createStore","store","privateKeyToAccount","store","queryOptions","skipToken","useClient","getBalanceQueryOptions","queryOptions","useQuery","useClient","queryOptions","skipToken","useQuery","getAction","getAction","queryOptions","skipToken","useClient","useQuery","useClient","queryOptions","skipToken","useQuery","getRecord","getRecord","queryOptions","skipToken","useClient","useQuery","queryOptions","getBalanceQueryOptions","useClient","useQuery","queryOptions","useQueryClient","useConfig","useClient","useQuery","useQuery","jsx","jsxs","createStore","store","error","useEffect","error","jsx","jsxs","useEffect","parseEventLogs","useQueryClient","getAction","entryPoint07Abi","sendUserOperation","waitForTransactionReceipt","useClient","resourceToHex","getAction","getRecord","getAction","getAction","isIdPlaceConnector","useQueryClient","useClient","getAction","parseEventLogs","entryPoint07Abi","sendUserOperation","resourceToHex","waitForTransactionReceipt","useClient","queryOptions","useQuery","useQueryClient","queryOptions","useQueryClient","useClient","useQuery","useEffect","error","jsx","jsxs","useEffect","useEffect","useState","parseEther","useQueryClient","twMerge","jsx","jsxs","formatEther","jsx","jsxs","useBalance","useQueryClient","useMutation","setBalance","useClient","useQueryClient","useClient","useMutation","setBalance","useEffect","useRef","twMerge","jsx","jsx","jsx","Fragment","jsx","jsxs","useQueryClient","useState","useBalance","setBalance","useEffect","parseEther","useEffect","useQueryClient","useState","useChains","useAccount","encodeFunctionData","useMutation","useQuery","useEffect","useRef","useAccount","useBalance","useWatchBlockNumber","twMerge","useEffect","useMemo","twMerge","jsx","jsx","twMerge","twMerge","jsx","twMerge","twMerge","jsx","fallback","forwardRef","jsx","ChainIcon","twMerge","createClient","useQuery","useQuery","createClient","getBalance","useQuery","skipToken","Fragment","jsx","jsxs","useMemo","useEffect","value","twMerge","formatEther","parseEther","twMerge","forwardRef","jsx","jsxs","forwardRef","AmountInput","twMerge","formatEther","parseEther","useAccount","useBalance","useSwitchChain","twMerge","parseEther","jsx","jsxs","useAccount","useBalance","useSwitchChain","jsx","Fragment","jsx","jsxs","useRef","useAccount","useBalance","useWatchBlockNumber","useEffect","jsxs","error","jsx","twMerge","Fragment","createStore","useStore","useCallback","useMemo","store","jsx","useAccount","useQuery","encodeFunctionData","useMutation","receipt","error","encodeFunctionData","useAccount","useMutation","useQuery","jsx","useAccount","useQuery","encodeFunctionData","useMutation","quote","amount","error","useEffect","useQuery","useQueryClient","useQuery","useEffect","useState","twMerge","jsx","jsx","jsxs","useState","useEffect","twMerge","useChains","Fragment","jsx","jsxs","useChains","chain","useQuery","useQuery","useChains","Fragment","jsx","jsxs","useChains","useQuery","useAccount","useClient","jsx","useQueryClient","useClient","useAccount","useQuery","useEffect","jsx","jsxs","useChains","useState","jsx","getAction","waitForTransactionReceipt","useAccount","useClient","useSwitchChain","useWriteContract","twMerge","useMutation","useQueryClient","jsx","jsxs","useWriteContract","useSwitchChain","useAccount","useQueryClient","useClient","useMutation","getAction","waitForTransactionReceipt","error","twMerge","useMutation","useQueryClient","http","debug","useQueryClient","useMutation","jsx","jsxs","GasBalance","useQueryClient","requestAllowance","useEffect","error","jsx","useState","useEffect","useRef","useMemo","steps","GasBalance","twMerge","useRef","jsx","useAccount","useEffect","twMerge","Fragment","jsx","jsxs","error","jsx","error","useStore","jsx","error","useStore","store","jsx","jsxs","twMerge","jsx","jsxs","useAccount","twMerge","twMerge","Fragment","jsx","jsxs","useRef","jsx","jsxs","twMerge","AccountButton","useAccount","useConnectorClient","useConnectorClient","numberToHex","error","listener","createClient","http","createClient","http","readContract","readContract"]}