@latticexyz/entrykit 2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f → 2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545

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.
@@ -1409,7 +1409,7 @@ import {
1409
1409
 
1410
1410
  // src/getSessionClient.ts
1411
1411
  import { smartAccountActions } from "permissionless";
1412
- import { callFrom } from "@latticexyz/world/internal";
1412
+ import { callFrom, sendUserOperationFrom } from "@latticexyz/world/internal";
1413
1413
 
1414
1414
  // src/createBundlerClient.ts
1415
1415
  import {
@@ -1468,6 +1468,12 @@ async function getSessionClient({
1468
1468
  delegatorAddress: userAddress,
1469
1469
  publicClient: client
1470
1470
  })
1471
+ ).extend(
1472
+ sendUserOperationFrom({
1473
+ worldAddress,
1474
+ delegatorAddress: userAddress,
1475
+ publicClient: client
1476
+ })
1471
1477
  ).extend(() => ({ userAddress, worldAddress, internal_signer: sessionSigner }));
1472
1478
  return sessionClient;
1473
1479
  }
@@ -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/ConnectWallet.tsx","../../../src/ui/Button.tsx","../../../src/icons/PendingIcon.tsx","../../../src/icons/Logo.tsx","../../../src/usePreloadImage.tsx","../../../src/AppInfo.tsx","../../../src/onboarding/ConnectedSteps.tsx","../../../src/onboarding/common.ts","../../../src/onboarding/quarry/useAllowance.ts","../../../src/quarry/getAllowance.ts","../../../src/quarry/common.ts","../../../src/getPaymaster.ts","../../../src/onboarding/quarry/useSpender.ts","../../../src/onboarding/quarry/getSpender.ts","../../../src/onboarding/useDelegation.ts","../../../src/onboarding/getDelegation.ts","../../../src/common.ts","../../../src/onboarding/usePrerequisites.ts","../../../src/useSessionAccount.ts","../../../src/getSessionAccount.ts","../../../src/getSessionSigner.ts","../../../src/store.ts","../../../src/onboarding/Wallet.tsx","../../../src/useENS.ts","../../../src/ui/TruncatedHex.tsx","../../../src/errors/store.ts","../../../src/errors/useShowMutationError.ts","../../../src/onboarding/quarry/useClaimGasPass.ts","../../../src/quarry/transports/quarryPassIssuer.ts","../../../src/quarry/claimGasPass.ts","../../../src/icons/EthIcon.tsx","../../../src/formatBalance.ts","../../../src/ui/Balance.tsx","../../../src/onboarding/quarry/Allowance.tsx","../../../src/errors/useShowQueryError.ts","../../../src/onboarding/useSetupSession.ts","../../../src/utils/defineCall.ts","../../../src/utils/callWithSignature.ts","../../../src/utils/signCall.ts","../../../src/onboarding/Session.tsx","../../../src/useSessionClient.ts","../../../src/getSessionClient.ts","../../../src/createBundlerClient.ts","../../../src/onboarding/GasBalance.tsx","../../../src/data/relayChains.json","../../../src/onboarding/useSetBalance.ts","../../../src/icons/IconSVG.tsx","../../../src/icons/CloseIcon.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/getWallets.ts","../../../src/getConnectors.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 zIndex: \"2147483646\",\n }\n : frameSize.width && frameSize.height\n ? {\n all: \"unset\",\n display: \"inline-grid\",\n width: `${frameSize.width}px`,\n height: `${frameSize.height}px`,\n }\n : {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n opacity: 0,\n pointerEvents: \"none\",\n };\n\n return (\n <iframe\n ref={mergeRefs([forwardedRef, frameRef])}\n style={frameStyle}\n onLoad={() => setLoaded(true)}\n srcDoc=\"<!doctype html><title>…</title>\"\n >\n {frameDocument\n ? ReactDOM.createPortal(\n <FrameProvider frame={frame}>\n {/*\n * TODO: make this the size of the outer window so that any container-based resizing in iframe\n * is done from that rather than the potentially-small size of this iframe\n */}\n <div>{mode === \"modal\" ? children : <Resizer onSize={setFrameSize}>{children}</Resizer>}</div>\n <style dangerouslySetInnerHTML={{ __html: css }} />\n </FrameProvider>,\n frameDocument.body,\n )\n : null}\n </iframe>\n );\n});\n","*, ::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.-mt-2 {\n margin-top: -0.5rem;\n}\n\n.block {\n display: 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.h-12 {\n height: 3rem;\n}\n\n.h-16 {\n height: 4rem;\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-full {\n height: 100%;\n}\n\n.max-h-full {\n max-height: 100%;\n}\n\n.min-h-\\[22rem\\] {\n min-height: 22rem;\n}\n\n.min-h-\\[26rem\\] {\n min-height: 26rem;\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-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-\\[0\\.6em\\] {\n width: 0.6em;\n}\n\n.w-\\[1\\.25em\\] {\n width: 1.25em;\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@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.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-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-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.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-4 {\n border-width: 4px;\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-transparent {\n border-color: transparent;\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-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-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-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-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-8 {\n padding-bottom: 2rem;\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-none {\n line-height: 1;\n}\n\n.tracking-\\[-1ch\\] {\n letter-spacing: -1ch;\n}\n\n.text-black {\n --tw-text-opacity: 1;\n color: rgb(0 0 0 / 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-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\\/80 {\n color: rgb(255 255 255 / 0.8);\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-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-neutral-700\\/50 {\n --tw-ring-color: rgb(64 64 64 / 0.5);\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.duration-100 {\n transition-duration: 100ms;\n}\n\n.duration-300 {\n transition-duration: 300ms;\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.fade-in {\n --tw-enter-opacity: 0;\n}\n\n.slide-in-from-bottom-16 {\n --tw-enter-translate-y: 4rem;\n}\n\n.slide-in-from-bottom-8 {\n --tw-enter-translate-y: 2rem;\n}\n\n.animate-duration-300 {\n animation-duration: 300ms;\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.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.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\\: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.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\\: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.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.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.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","import { createContext, useContext, type ReactNode } from \"react\";\n\ntype ContextValue = {\n readonly frame: HTMLIFrameElement;\n};\n\n/** @internal */\nconst Context = createContext<ContextValue | null>(null);\n\nexport type Props = {\n frame: HTMLIFrameElement;\n children?: ReactNode;\n};\n\nexport function FrameProvider({ frame, children }: Props) {\n const value = useContext(Context);\n if (value) throw new Error(\"`FrameProvider` can only be used once.\");\n return <Context.Provider value={{ frame }}>{children}</Context.Provider>;\n}\n\nexport function useFrame(): ContextValue {\n const value = useContext(Context);\n if (!value) throw new Error(\"`useFrame` can only be used within a `FrameProvider`.\");\n return value;\n}\n","import { useMediaQuery } from \"usehooks-ts\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useTheme() {\n const { theme: initialTheme } = useEntryKitConfig();\n const darkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\n const theme = initialTheme ?? (darkMode ? \"dark\" : \"light\");\n return theme;\n}\n","import \"@rainbow-me/rainbowkit/styles.css\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { RainbowKitProvider, midnightTheme } from \"@rainbow-me/rainbowkit\";\nimport { EntryKitConfig } from \"./config/output\";\nimport { Chain } from \"viem\";\nimport { useChains } from \"wagmi\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\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 <RainbowKitProvider\n // Prevent RainbowKit/Wagmi trying to switch chains after connection\n // https://github.com/rainbow-me/rainbowkit/blob/d76bb28a67609d9855b8045e5f5f4641dff1e032/packages/rainbowkit/src/wallets/useWalletConnectors.ts#L58-L67\n // https://github.com/wevm/wagmi/blob/cb58b1ea3ad40e77210f24eb598f9d2306db998c/packages/core/src/connectors/injected.ts#L176-L184\n initialChain={0}\n appInfo={{\n appName: config.appName,\n // TODO: learn more and disclaimer\n }}\n theme={midnightTheme({ borderRadius: \"none\" })}\n >\n <Context.Provider value={{ ...config, chain }}>{children}</Context.Provider>\n </RainbowKitProvider>\n );\n}\n\nexport function useEntryKitConfig(): ContextValue {\n const config = useContext(Context);\n if (!config) throw new Error(\"`useEntryKitConfig` can only be used within a `EntryKitProvider`.\");\n return config;\n}\n","import { 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\";\n\nexport function getBundlerTransport(chain: Chain) {\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n // TODO: bundler websocket\n const bundlerTransport = bundlerHttpUrl\n ? http(bundlerHttpUrl)\n : chain.id === 31337\n ? 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 })\n : null;\n if (!bundlerTransport) {\n throw new Error(`Chain ${chain.id} config did not include a bundler RPC URL.`);\n }\n return bundlerTransport;\n}\n","import {\n BundlerRpcSchema,\n EIP1193RequestFn,\n Hash,\n RpcUserOperationReceipt,\n Transport,\n createTransport,\n numberToHex,\n parseEther,\n} from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\nimport { TransportRequestFn } from \"./common\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { sendUserOperation } from \"./methods/sendUserOperation\";\nimport { ConnectedClient } from \"../../common\";\nimport { debug } from \"../debug\";\nimport { setBalance } from \"viem/actions\";\n\n// TODO: move to common package?\n\nexport function userOpExecutor({ executor }: { executor: ConnectedClient }): Transport {\n return () => {\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 [hash] = params;\n return receipts.get(hash) ?? null;\n }\n\n if (method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas(params);\n }\n\n throw new Error(`userOpExecutor: method \"${method}\" not supported`);\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 userClient = useConnectorClient({ chainId });\n const { address: userAddress } = useAccount();\n const initialUserAddress = useRef(userAddress);\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n\n return <ConnectedSteps userClient={userClient.data} initialUserAddress={initialUserAddress.current} />;\n}\n","import { useAccount } from \"wagmi\";\nimport { Button } from \"./ui/Button\";\nimport { useConnectModal } from \"@rainbow-me/rainbowkit\";\nimport { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useEffect, useState } from \"react\";\n\nexport function ConnectWallet() {\n const userAccount = useAccount();\n const { openConnectModal, connectModalOpen } = useConnectModal();\n const [hasAutoOpened, setHasAutoOpened] = useState(false);\n\n // automatically open connect modal once\n // TODO: remove this once we have more than \"connect wallet\" as an option\n useEffect(() => {\n if (!connectModalOpen && !hasAutoOpened) {\n openConnectModal?.();\n setHasAutoOpened(true);\n }\n }, [connectModalOpen, hasAutoOpened, openConnectModal]);\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 <Button\n key=\"create\"\n variant=\"secondary\"\n className=\"self-auto flex justify-center\"\n disabled={userAccount.status === \"connecting\"}\n onClick={openConnectModal}\n autoFocus\n >\n Connect wallet\n </Button>\n </div>\n </div>\n );\n}\n","/* eslint-disable max-len */\nimport { ButtonHTMLAttributes, DetailedHTMLProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\n\n// TODO: add support for async onClick, where pending is enabled automatically\n// TODO: add error state with popover/tooltip\n\ntype ButtonClassNameOptions = {\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n pending?: boolean;\n};\n\nconst buttonClassName = ({ variant = \"secondary\" }: ButtonClassNameOptions = {}) =>\n twMerge(\n \"group/button self-center leading-none outline-none border-4 border-transparent\",\n \"transition hover:brightness-125 active:brightness-150\",\n \"focus:border-orange-500\",\n \"aria-disabled:pointer-events-none aria-busy:pointer-events-none\",\n // TODO: better disabled state\n \"aria-disabled:opacity-50\",\n \"p-[.75em] font-medium\",\n {\n primary: twMerge(\"bg-orange-600 text-white focus:border-yellow-400\"),\n secondary: twMerge(\"bg-neutral-700 text-white focus:border-orange-500\"),\n tertiary: twMerge(\"bg-neutral-800 text-white focus:border-orange-500\"),\n }[variant],\n );\n\nexport type ButtonProps = {\n pending?: boolean;\n variant?: ButtonClassNameOptions[\"variant\"];\n};\n\nexport type Props = ButtonProps & DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;\n\nexport const Button = ({ pending, variant, type, className, children, disabled, ...props }: Props) => {\n return (\n <button\n type={type || \"button\"}\n className={twMerge(buttonClassName({ variant, pending }), className)}\n aria-busy={pending}\n aria-disabled={disabled}\n disabled={disabled || pending}\n {...props}\n >\n <span className=\"grid grid-cols-[1fr_auto_1fr] gap-2\">\n <span className=\"flex items-center justify-end text-[.75em]\">\n <span className=\"transition opacity-0 translate-x-2 group-aria-busy/button:opacity-100 group-aria-busy/button:translate-x-0 duration-100 group-aria-busy/button:duration-300\">\n <PendingIcon />\n </span>\n </span>\n <span>{children}</span>\n </span>\n </button>\n );\n};\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function PendingIcon({ className, ...props }: Props) {\n return (\n <svg\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em] animate-spin\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n","import { 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 dark:bg-neutral-800\" />\n )\n ) : null}\n </div>\n <div className=\"text-2xl text-white text-center\">{appName}</div>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { twMerge } from \"tailwind-merge\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Wallet } from \"./Wallet\";\nimport { Allowance } from \"./quarry/Allowance\";\nimport { Session } from \"./Session\";\nimport { Step } from \"./common\";\nimport { Address } from \"viem\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { GasBalance } from \"./GasBalance\";\n\nexport type Props = {\n userClient: ConnectedClient;\n initialUserAddress: Address | undefined;\n};\n\nexport function ConnectedSteps({ userClient, initialUserAddress }: Props) {\n const { chain } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\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 } = 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: \"allowance\",\n isComplete: !!hasAllowance,\n content: (props) => <Allowance {...props} userAddress={userAddress} />,\n });\n }\n\n steps.push({\n id: \"session\",\n isComplete: !!isSpender && !!hasDelegation,\n content: (props) => (\n <Session {...props} userClient={userClient} registerSpender={!isSpender} registerDelegation={!hasDelegation} />\n ),\n });\n\n return steps;\n }, [hasAllowance, hasDelegation, hasGasBalance, isSpender, paymaster, sessionAddress, userAddress, userClient]);\n\n const [selectedStepId] = useState<null | string>(null);\n const nextStep = steps.find((step) => step.content != null && !step.isComplete);\n const completedSteps = steps.filter((step) => step.isComplete);\n const activeStep =\n (selectedStepId != null ? steps.find((step) => step.id === selectedStepId) : null) ??\n nextStep ??\n (completedSteps.length < steps.length ? completedSteps.at(-1) : null);\n const activeStepIndex = activeStep ? steps.indexOf(activeStep) : -1;\n\n return (\n <div\n className={twMerge(\n // steps.length === 2 ? \"min-h-[22rem]\" : \"min-h-[26rem]\",\n \"px-8 flex flex-col divide-y divide-neutral-800\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\",\n )}\n >\n {steps.map((step, i) => {\n const isActive = step === activeStep;\n const isExpanded = isActive || completedSteps.length === steps.length;\n const isDisabled = !step.isComplete && activeStepIndex !== -1 && i > activeStepIndex;\n return (\n <div key={step.id} className={twMerge(\"py-8 flex flex-col justify-center\", isActive ? \"flex-grow\" : null)}>\n <div className={twMerge(\"flex flex-col\", isDisabled ? \"opacity-30 pointer-events-none\" : null)}>\n {step.content({ isActive, isExpanded })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { parseEther } from \"viem\";\n\nexport type Step = {\n id: string;\n isComplete: boolean;\n content: (props: { isActive: boolean; isExpanded: boolean }) => ReactNode;\n};\n\n// TODO: move to chain config?\nexport const minGasBalance = parseEther(\"0.01\");\n\nexport type RelayChain = {\n bridgeUrl: string;\n};\nexport type RelayChains = {\n [chainId: number]: RelayChain | undefined;\n};\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { 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 const queryKey = [\"getAllowance\", client?.uid, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getAllowance({ client, userAddress }),\n }\n : { queryKey, enabled: false },\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, numberToHex } from \"viem\";\nimport { paymasterTables } from \"./common\";\nimport { getRecord, getStaticDataLocation } from \"@latticexyz/store/internal\";\nimport { getKeyTuple } from \"@latticexyz/protocol-parser/internal\";\nimport { setStorageAt } from \"viem/actions\";\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) {\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.Allowance,\n key: { user: userAddress },\n blockTag: \"pending\",\n });\n return record.allowance;\n}\n\nexport function getAllowanceSlot({ userAddress }: { userAddress: Address }) {\n return getStaticDataLocation(\n paymasterTables.Allowance.tableId,\n getKeyTuple(paymasterTables.Allowance, { user: userAddress }),\n );\n}\n\n// TODO: move this into some sort of store util to `setField`\nexport async function setAllowanceSlot({ client, userAddress, allowance }: GetAllowanceParams & { allowance: bigint }) {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return;\n\n const slot = getStaticDataLocation(\n paymasterTables.Allowance.tableId,\n getKeyTuple(paymasterTables.Allowance, { user: userAddress }),\n );\n\n await setStorageAt(\n client.extend(() => ({ mode: \"anvil\" })),\n {\n address: paymaster.address,\n index: slot,\n value: numberToHex(allowance, { size: 32 }),\n },\n );\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: move the whole paymaster in here so we can just re-export ABI + MUD config\n\nexport const paymasterAbi = parseAbi([\n \"error SpenderSystem_AlreadyRegistered(address spender, address user)\",\n \"error SpenderSystem_HasOwnBalance(address spender)\",\n \"function registerSpender(address spender)\",\n]);\n\nexport const paymasterConfig = defineStore({\n namespaces: {\n root: {\n namespace: \"\",\n tables: {\n Allowance: {\n schema: {\n user: \"address\",\n allowance: \"uint256\",\n },\n key: [\"user\"],\n },\n Grantor: {\n schema: {\n grantor: \"address\",\n allowance: \"uint256\",\n },\n key: [\"grantor\"],\n },\n PassHolder: {\n schema: {\n user: \"address\",\n passId: \"bytes32\",\n lastRenewed: \"uint256\",\n lastClaimed: \"uint256\",\n },\n key: [\"user\", \"passId\"],\n },\n PassConfig: {\n schema: {\n passId: \"bytes32\",\n claimAmount: \"uint256\",\n claimInterval: \"uint256\",\n validityPeriod: \"uint256\",\n grantor: \"address\",\n },\n key: [\"passId\"],\n },\n Spender: {\n schema: {\n spender: \"address\",\n user: \"address\",\n },\n key: [\"spender\"],\n },\n SystemConfig: {\n schema: {\n entryPoint: \"address\",\n },\n key: [],\n },\n },\n },\n },\n});\n\nexport const paymasterTables = paymasterConfig.namespaces.root.tables;\n","import { Chain, Hex } from \"viem\";\n\nexport type Paymaster = {\n readonly type: \"simple\" | \"quarry\";\n readonly address: Hex;\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 };\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, 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 const queryKey = [\"getSpender\", client?.uid, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getSpender({ client, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\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 { 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 { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getDelegation } from \"./getDelegation\";\n\nexport function getDelegationQueryOptions({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n worldAddress: Address;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n const queryKey = [\"getDelegation\", client?.uid, worldAddress, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getDelegation({ client, worldAddress, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useDelegation(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress }));\n}\n","import { Address, 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 { minGasBalance } from \"./common\";\nimport { getAllowanceQueryOptions } from \"./quarry/useAllowance\";\nimport { getSpenderQueryOptions } from \"./quarry/useSpender\";\nimport { getDelegationQueryOptions } from \"./useDelegation\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { Config, useClient, useConfig } from \"wagmi\";\nimport { Address, Chain, Client, Transport } from \"viem\";\nimport { getSessionAccountQueryOptions } from \"../useSessionAccount\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { getBalanceQueryOptions } from \"wagmi/query\";\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 const queryKey = [\"getPrerequisites\", client?.uid, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n async queryFn() {\n const paymaster = getPaymaster(client.chain);\n\n const {\n account: { address: sessionAddress },\n } = await queryClient.fetchQuery(getSessionAccountQueryOptions({ client, userAddress }));\n const [sessionBalance, allowance, spender, hasDelegation] = await Promise.all([\n !paymaster\n ? queryClient.fetchQuery(\n getBalanceQueryOptions(config, { chainId: client.chain.id, address: sessionAddress }),\n )\n : null,\n paymaster?.type === \"quarry\"\n ? queryClient.fetchQuery(getAllowanceQueryOptions({ client, userAddress }))\n : null,\n paymaster?.type === \"quarry\"\n ? queryClient.fetchQuery(getSpenderQueryOptions({ client, userAddress, sessionAddress }))\n : null,\n queryClient.fetchQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress })),\n ]);\n // TODO: figure out better approach than null for allowance/spender when no quarry paymaster\n const hasAllowance = allowance == null || allowance >= minGasBalance;\n const isSpender = spender == null ? true : spender;\n const hasGasBalance = sessionBalance == null || sessionBalance.value >= minGasBalance;\n return {\n sessionAddress,\n hasAllowance,\n isSpender,\n hasGasBalance,\n hasDelegation,\n // we intentionally don't enforce an allowance/gas balance here\n complete: isSpender && hasDelegation,\n };\n },\n retry: false,\n }\n : { queryKey, enabled: 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 { UndefinedInitialDataOptions, UseQueryResult, queryOptions, 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 const queryKey = [\"getSessionAccount\", client?.uid, userAddress];\n return queryOptions<GetSessionAccountReturnType>(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getSessionAccount({ client, userAddress }),\n staleTime: Infinity,\n // TODO: replace with function to retry only connection errors\n retry: false,\n }\n : { queryKey, enabled: 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 { 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\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useShowMutationError(useDisconnect());\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Account</div>\n <div className=\"font-mono text-white\">{ens?.name ?? <TruncatedHex hex={userAddress} />}</div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={disconnectIsPending}\n onClick={() => {\n closeAccountModal();\n disconnect();\n }}\n >\n Sign out\n </Button>\n </div>\n {isExpanded ? (\n <p className=\"text-sm\">Each of your onchain actions in this app is associated with your account.</p>\n ) : null}\n </div>\n );\n}\n","import { Hex } from \"viem\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nexport function useENS(address: Hex | undefined) {\n const normalizedAddress = address?.toLowerCase();\n return useQuery<{\n address: string | undefined;\n name: string | undefined;\n displayName: string | undefined;\n avatar: string | undefined;\n }>({\n enabled: !!normalizedAddress,\n queryKey: [\"ens\", normalizedAddress],\n\n queryFn: async () => {\n // TODO: typed response\n const data = await fetch(`https://api.ensideas.com/ens/resolve/${normalizedAddress}`).then((res) => res.json());\n return {\n address: data.address ?? undefined,\n name: data.name ?? undefined,\n displayName: data.displayName ?? undefined,\n avatar: data.avatar ?? undefined,\n };\n },\n });\n}\n","import { Hex } from \"viem\";\n\nexport type Props = {\n hex: Hex;\n};\n\nexport function TruncatedHex({ hex }: Props) {\n if (hex.length <= 10) {\n return <span title={hex}>{hex}</span>;\n }\n\n return (\n <span title={hex}>\n <span className=\"after:select-none after:content-['…']\">{hex.slice(0, 6)}</span>\n <span className=\"tracking-[-1ch] text-transparent\">{hex.slice(6, -4)}</span>\n {hex.slice(-4)}\n </span>\n );\n}\n","import { 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 { Address, parseEther } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { claimGasPass } from \"../../quarry/claimGasPass\";\nimport { setAllowanceSlot } from \"../../quarry/getAllowance\";\nimport { useClient } from \"wagmi\";\n\nexport function useClaimGasPass() {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n const client = useClient({ chainId: chain.id });\n\n const mutationKey = [\"claimGasPass\", chain.id];\n return useMutation({\n retry: 0,\n mutationKey,\n mutationFn: async (userAddress: Address) => {\n if (chain.id === 31337) {\n if (!client) throw new Error(\"No client?\");\n await setAllowanceSlot({ client, userAddress, allowance: parseEther(\"1\") });\n } else {\n // TODO: handle case where you already have a pass?\n // TODO: get returned tx hashes to check if success\n await claimGasPass({ chain, userAddress });\n }\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getAllowance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n });\n}\n","import { Address, EIP1193RequestFn, Hex, Transport, http } from \"viem\";\n\nexport type QuarryPassIssuerRpcSchema = [\n {\n Method: \"quarry_issuePass\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n {\n Method: \"quarry_claimAllowance\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n];\n\nexport function quarryPassIssuer(): Transport<\"http\", {}, EIP1193RequestFn<QuarryPassIssuerRpcSchema>> {\n return ({ chain }) => {\n if (!chain) throw new Error(\"No chain provided to issuer transport.\");\n\n const url = \"quarryPassIssuer\" in chain.rpcUrls ? chain.rpcUrls.quarryPassIssuer.http[0] : undefined;\n // TODO: add fallback for anvil to do what quarryPassIssuer does internally\n if (!url) throw new Error(`No \\`quarryPassIssuer\\` RPC URL found for chain ${chain.id}.`);\n\n return http(url)({ chain, retryCount: 0 });\n };\n}\n","import { Address, Chain } from \"viem\";\nimport { quarryPassIssuer } from \"./transports/quarryPassIssuer\";\nimport { debug } from \"./debug\";\n\nexport async function claimGasPass({ chain, userAddress }: { chain: Chain; userAddress: Address }) {\n const transport = quarryPassIssuer()({ chain });\n\n // TODO: handle case where you already have a pass?\n debug(\"Issuing gas pass to\", userAddress);\n await transport.request({\n method: \"quarry_issuePass\",\n params: [\"0x01\", userAddress],\n });\n\n debug(\"Claiming gas allowance for\", userAddress);\n await transport.request({\n method: \"quarry_claimAllowance\",\n params: [\"0x01\", 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 magnitude = Math.floor(parseFloat(formatted)).toString().length;\n return parseFloat(formatted).toLocaleString(\"en-US\", { maximumFractionDigits: Math.max(0, 6 - magnitude) });\n}\n","import { EthIcon } from \"../icons/EthIcon\";\nimport { formatBalance } from \"../formatBalance\";\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 { Hex } from \"viem\";\nimport { useAllowance } from \"./useAllowance\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\nimport { useClaimGasPass } from \"./useClaimGasPass\";\nimport { Button } from \"../../ui/Button\";\nimport { Balance } from \"../../ui/Balance\";\nimport { useEffect } from \"react\";\nimport { minGasBalance } from \"../common\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useShowMutationError } from \"../../errors/useShowMutationError\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n userAddress: Hex;\n};\n\nexport function Allowance({ isActive, isExpanded, userAddress }: Props) {\n const allowance = useShowQueryError(useAllowance(userAddress));\n const claimGasPass = useShowMutationError(useClaimGasPass());\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (\n isActive &&\n claimGasPass.status === \"idle\" &&\n allowance.isSuccess &&\n allowance.data != null &&\n allowance.data < minGasBalance\n ) {\n claimGasPass.mutate(userAddress);\n }\n });\n return () => clearTimeout(timer);\n }, [allowance.data, allowance.isSuccess, claimGasPass, 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\" || claimGasPass.status === \"pending\"}\n onClick={() => claimGasPass.mutate(userAddress)}\n >\n Top up\n </Button>\n </div>\n {isExpanded ? <p className=\"text-sm\">Your allowance is used to pay for onchain computation.</p> : null}\n </div>\n );\n}\n","import { 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 { Hex, encodeFunctionData } from \"viem\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { getAction } from \"viem/utils\";\nimport { sendUserOperation, waitForUserOperationReceipt } from \"viem/account-abstraction\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { ConnectedClient, unlimitedDelegationControlId, worldAbi } from \"../common\";\nimport { paymasterAbi } from \"../quarry/common\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\nimport { defineCall } from \"../utils/defineCall\";\nimport { useClient } from \"wagmi\";\nimport { resourceToHex } from \"@latticexyz/common\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\";\nimport { callWithSignature } from \"../utils/callWithSignature\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { systemsConfig as worldSystemsConfig } from \"@latticexyz/world/mud.config\";\n\nexport function useSetupSession({ userClient }: { 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\");\n\n 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 } 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 signature = await signCall(opts);\n return getAction(\n sessionClient,\n viem_writeContract,\n \"writeContract\",\n )({\n address: opts.worldAddress,\n abi: CallWithSignatureAbi,\n functionName: \"callWithSignature\",\n args: [opts.userClient.account.address, opts.systemId, opts.callData, signature],\n } as never);\n}\n","import { Address, Chain, Client, Hex, OneOf, Transport, toHex } from \"viem\";\nimport { signTypedData } from \"viem/actions\";\nimport { callWithSignatureTypes } from \"@latticexyz/world-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 { Button } from \"../ui/Button\";\nimport { useSetupSession } from \"./useSetupSession\";\nimport { ConnectedClient } from \"../common\";\nimport { useEffect } from \"react\";\nimport { useSessionClient } from \"../useSessionClient\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n};\n\nexport function Session({ isActive, isExpanded, userClient, registerSpender, registerDelegation }: Props) {\n const sessionClient = useShowQueryError(useSessionClient(userClient.account.address));\n const setup = useShowMutationError(useSetupSession({ userClient }));\n const hasSession = !registerDelegation && !registerDelegation;\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (isActive && setup.status === \"idle\" && sessionClient.data && !hasSession) {\n setup.mutate({\n sessionClient: sessionClient.data,\n registerSpender,\n registerDelegation,\n });\n }\n });\n return () => clearTimeout(timer);\n }, [hasSession, isActive, registerDelegation, registerSpender, sessionClient, setup]);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Session</div>\n <div className=\"font-mono text-white\">{hasSession ? \"Enabled\" : \"Set up\"}</div>\n </div>\n {hasSession ? (\n <Button variant=\"tertiary\" className=\"flex-shrink-0 text-sm p-1 w-28\" autoFocus={isActive} disabled>\n Enabled\n </Button>\n ) : (\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={!sessionClient.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 { 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 const queryKey = [\"getSessionClient\", client?.uid, userAddress, worldAddress];\n return queryOptions<SessionClient>(\n userAddress\n ? {\n queryKey,\n async queryFn() {\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 : { queryKey, enabled: 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 } 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 } as never),\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 { 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 { getAction } from \"viem/utils\";\nimport { estimateFeesPerGas } from \"viem/actions\";\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, rhodolite, pyrope chains\n // because viem sets fees way too high by default\n // https://github.com/wevm/viem/blob/253b1072ad9fe36a0e0491e173c85a6d69209ada/src/account-abstraction/actions/bundler/prepareUserOperation.ts#L436-L457\n if ([690, 17069, 17420, 695569].includes(client.chain.id)) {\n // TODO: move to fee ref or similar approach\n return () => getAction(client, estimateFeesPerGas, \"estimateFeesPerGas\")({ chain: client.chain });\n }\n}\n","import { Hex } from \"viem\";\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, minGasBalance } from \"./common\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n sessionAddress: Hex;\n};\n\nexport function GasBalance({ isActive, isExpanded, sessionAddress }: Props) {\n const { chain } = useEntryKitConfig();\n\n const balance = useShowQueryError(useBalance({ chainId: chain.id, address: sessionAddress }));\n useWatchBlockNumber({ onBlockNumber: () => balance.refetch() });\n\n const setBalance = useShowMutationError(useSetBalance());\n\n const relayChain = (relayChains as RelayChains)[chain.id];\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: minGasBalance + (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 })}`}\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 className=\"font-mono text-white\">\n <TruncatedHex hex={sessionAddress} />\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: [\"getPrerequisites\"] }),\n ]);\n\n return null;\n },\n });\n}\n","import { SVGProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = SVGProps<SVGSVGElement>;\n\nexport function IconSVG({ className, children, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {children}\n </svg>\n );\n}\n","import { IconSVG, Props } from \"./IconSVG\";\n\nexport function CloseIcon(props: Props) {\n return (\n <IconSVG strokeWidth=\"2\" stroke=\"currentColor\" {...props}>\n <path\n d=\"M6 18L18 6M6 6L18 18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { 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}\n onClick={openAccountModal}\n >\n <span className=\"pointer-events-none inline-grid place-items-center -ml-3\">\n <span\n className={twMerge(\n \"col-start-1 row-start-1 leading-none\",\n \"scale-100 opacity-100 transition duration-300\",\n \"group-aria-busy:scale-125 group-aria-busy:opacity-0\",\n )}\n >\n <Logo />\n </span>\n <span\n aria-hidden\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"scale-50 opacity-0 transition duration-300 delay-50\",\n \"group-aria-busy:scale-100 group-aria-busy:opacity-100\",\n )}\n >\n <PendingIcon />\n </span>\n </span>\n <span className=\"font-medium\">{buttonLabel}</span>\n </button>\n )}\n </Shadow>\n );\n}\n","import { Hex } from \"viem\";\nimport { useENS } from \"./useENS\";\nimport { Logo } from \"./icons/Logo\";\nimport { TruncatedHex } from \"./ui/TruncatedHex\";\nimport { usePreloadImage } from \"./usePreloadImage\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n address: Hex;\n};\n\nexport function AccountName({ address }: Props) {\n const { data: ens } = useENS(address);\n const avatar = usePreloadImage(ens?.avatar);\n\n return (\n <>\n <span className=\"flex-shrink-0 w-6 h-6 -my-1 -mx-0.5 grid place-items-center\">\n <img\n src={ens?.avatar && avatar.isSuccess ? ens.avatar : undefined}\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"inline-flex w-full h-full rounded-full bg-black/10 dark:bg-white/10 bg-cover bg-no-repeat bg-center\",\n \"transtion duration-300\",\n avatar.isSuccess ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <Logo\n className={twMerge(\n \"col-start-1 row-start-1 text-orange-500\",\n \"transition duration-300\",\n ens && (!ens.avatar || avatar.isError) ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n </span>\n <span className=\"flex-grow\">{ens?.name ?? <TruncatedHex hex={address} />}</span>\n </>\n );\n}\n","// Exported `useSessionClient` variant and only provides the session client once all prerequisites are met.\n\nimport { useConnectorClient } from \"wagmi\";\nimport { useSessionClient } from \"./useSessionClient\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { usePrerequisites } from \"./onboarding/usePrerequisites\";\nimport { UseQueryResult } from \"@tanstack/react-query\";\nimport { SessionClient } from \"./common\";\n\nexport function useSessionClientReady(): UseQueryResult<SessionClient | undefined> {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n if (userClient.error) console.error(\"Error retrieving user client\", userClient.error);\n\n const userAddress = userClient.data?.account.address;\n const prerequisites = usePrerequisites(userAddress);\n const sessionClient = useSessionClient(userAddress);\n\n if (!userClient.isSuccess) return { ...userClient, data: undefined } as never;\n if (!prerequisites.isSuccess || !prerequisites.data.complete) return { ...prerequisites, data: undefined } as never;\n return sessionClient;\n}\n","import { Chain, Transport } from \"viem\";\nimport { connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { Config, CreateConfigParameters, createConfig } from \"wagmi\";\nimport { getWallets } from \"./getWallets\";\n\nexport type CreateWagmiConfigOptions<\n chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport> = Record<chains[number][\"id\"], Transport>,\n> = {\n readonly chainId: number;\n readonly chains: chains;\n readonly transports: transports;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & Pick<CreateConfigParameters<chains, transports>, \"pollingInterval\">;\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n>(config: CreateWagmiConfigOptions<chains, transports>): Config<chains, transports> {\n const wallets = getWallets(config);\n const connectors = connectorsForWallets(wallets, {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n\n return createConfig({\n connectors,\n chains: config.chains,\n transports: config.transports,\n pollingInterval: config.pollingInterval,\n }) as never;\n}\n","import { WalletList, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\n\nexport function getWallets(_config: { readonly chainId: number }): WalletList {\n const { wallets: defaultWallets } = getDefaultWallets();\n return [\n // TODO: passkey wallet\n ...defaultWallets,\n ];\n}\n","import { WalletList, connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { getWallets } from \"./getWallets\";\nimport { CreateConnectorFn } from \"wagmi\";\n\nexport function getConnectors({\n wallets,\n ...config\n}: {\n readonly chainId: number;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & { readonly wallets?: WalletList }): CreateConnectorFn[] {\n return connectorsForWallets(wallets ?? getWallets(config), {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n}\n","import { 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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AA,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,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,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;AA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","names":["useEffect","createContext","useContext","entryPoint07Address","debug","debug","entryPoint07Address","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","useState","jsx","jsxs","useEffect","useMemo","useRef","useState","twMerge","parseEther","useQuery","numberToHex","numberToHex","useQuery","useClient","queryOptions","useQuery","getRecord","getRecord","queryOptions","useClient","queryOptions","useQuery","getRecord","parseAbi","getRecord","queryOptions","queryOptions","useQuery","useClient","useClient","queryOptions","useQuery","createStore","store","privateKeyToAccount","store","queryOptions","queryOptions","useClient","useQuery","useQuery","jsx","jsxs","createStore","store","error","useEffect","error","jsx","jsxs","parseEther","useQueryClient","http","debug","useClient","useQueryClient","parseEther","twMerge","jsx","jsxs","formatEther","jsx","jsxs","useEffect","useEffect","error","jsx","jsxs","claimGasPass","useEffect","useMutation","useQueryClient","getAction","sendUserOperation","waitForTransactionReceipt","useClient","resourceToHex","getAction","getRecord","getAction","getAction","useQueryClient","useClient","useMutation","getAction","sendUserOperation","resourceToHex","waitForTransactionReceipt","useEffect","useClient","queryOptions","useQuery","useQueryClient","getAction","queryOptions","useQueryClient","useClient","useQuery","jsx","jsxs","useEffect","useQueryClient","useMutation","setBalance","useClient","useQueryClient","useClient","useMutation","setBalance","jsx","jsxs","setBalance","jsx","useEffect","useRef","useMemo","steps","useState","twMerge","useRef","jsx","useAccount","twMerge","jsx","jsx","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","useAccount","useConnectorClient","useConnectorClient","connectorsForWallets","connectorsForWallets"]}
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/ConnectWallet.tsx","../../../src/ui/Button.tsx","../../../src/icons/PendingIcon.tsx","../../../src/icons/Logo.tsx","../../../src/usePreloadImage.tsx","../../../src/AppInfo.tsx","../../../src/onboarding/ConnectedSteps.tsx","../../../src/onboarding/common.ts","../../../src/onboarding/quarry/useAllowance.ts","../../../src/quarry/getAllowance.ts","../../../src/quarry/common.ts","../../../src/getPaymaster.ts","../../../src/onboarding/quarry/useSpender.ts","../../../src/onboarding/quarry/getSpender.ts","../../../src/onboarding/useDelegation.ts","../../../src/onboarding/getDelegation.ts","../../../src/common.ts","../../../src/onboarding/usePrerequisites.ts","../../../src/useSessionAccount.ts","../../../src/getSessionAccount.ts","../../../src/getSessionSigner.ts","../../../src/store.ts","../../../src/onboarding/Wallet.tsx","../../../src/useENS.ts","../../../src/ui/TruncatedHex.tsx","../../../src/errors/store.ts","../../../src/errors/useShowMutationError.ts","../../../src/onboarding/quarry/useClaimGasPass.ts","../../../src/quarry/transports/quarryPassIssuer.ts","../../../src/quarry/claimGasPass.ts","../../../src/icons/EthIcon.tsx","../../../src/formatBalance.ts","../../../src/ui/Balance.tsx","../../../src/onboarding/quarry/Allowance.tsx","../../../src/errors/useShowQueryError.ts","../../../src/onboarding/useSetupSession.ts","../../../src/utils/defineCall.ts","../../../src/utils/callWithSignature.ts","../../../src/utils/signCall.ts","../../../src/onboarding/Session.tsx","../../../src/useSessionClient.ts","../../../src/getSessionClient.ts","../../../src/createBundlerClient.ts","../../../src/onboarding/GasBalance.tsx","../../../src/data/relayChains.json","../../../src/onboarding/useSetBalance.ts","../../../src/icons/IconSVG.tsx","../../../src/icons/CloseIcon.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/getWallets.ts","../../../src/getConnectors.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 zIndex: \"2147483646\",\n }\n : frameSize.width && frameSize.height\n ? {\n all: \"unset\",\n display: \"inline-grid\",\n width: `${frameSize.width}px`,\n height: `${frameSize.height}px`,\n }\n : {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n opacity: 0,\n pointerEvents: \"none\",\n };\n\n return (\n <iframe\n ref={mergeRefs([forwardedRef, frameRef])}\n style={frameStyle}\n onLoad={() => setLoaded(true)}\n srcDoc=\"<!doctype html><title>…</title>\"\n >\n {frameDocument\n ? ReactDOM.createPortal(\n <FrameProvider frame={frame}>\n {/*\n * TODO: make this the size of the outer window so that any container-based resizing in iframe\n * is done from that rather than the potentially-small size of this iframe\n */}\n <div>{mode === \"modal\" ? children : <Resizer onSize={setFrameSize}>{children}</Resizer>}</div>\n <style dangerouslySetInnerHTML={{ __html: css }} />\n </FrameProvider>,\n frameDocument.body,\n )\n : null}\n </iframe>\n );\n});\n","*, ::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.-mt-2 {\n margin-top: -0.5rem;\n}\n\n.block {\n display: 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.h-12 {\n height: 3rem;\n}\n\n.h-16 {\n height: 4rem;\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-full {\n height: 100%;\n}\n\n.max-h-full {\n max-height: 100%;\n}\n\n.min-h-\\[22rem\\] {\n min-height: 22rem;\n}\n\n.min-h-\\[26rem\\] {\n min-height: 26rem;\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-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-\\[0\\.6em\\] {\n width: 0.6em;\n}\n\n.w-\\[1\\.25em\\] {\n width: 1.25em;\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@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.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-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-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.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-4 {\n border-width: 4px;\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-transparent {\n border-color: transparent;\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-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-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-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-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-8 {\n padding-bottom: 2rem;\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-none {\n line-height: 1;\n}\n\n.tracking-\\[-1ch\\] {\n letter-spacing: -1ch;\n}\n\n.text-black {\n --tw-text-opacity: 1;\n color: rgb(0 0 0 / 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-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\\/80 {\n color: rgb(255 255 255 / 0.8);\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-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-neutral-700\\/50 {\n --tw-ring-color: rgb(64 64 64 / 0.5);\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.duration-100 {\n transition-duration: 100ms;\n}\n\n.duration-300 {\n transition-duration: 300ms;\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.fade-in {\n --tw-enter-opacity: 0;\n}\n\n.slide-in-from-bottom-16 {\n --tw-enter-translate-y: 4rem;\n}\n\n.slide-in-from-bottom-8 {\n --tw-enter-translate-y: 2rem;\n}\n\n.animate-duration-300 {\n animation-duration: 300ms;\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.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.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\\: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.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\\: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.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.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.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","import { createContext, useContext, type ReactNode } from \"react\";\n\ntype ContextValue = {\n readonly frame: HTMLIFrameElement;\n};\n\n/** @internal */\nconst Context = createContext<ContextValue | null>(null);\n\nexport type Props = {\n frame: HTMLIFrameElement;\n children?: ReactNode;\n};\n\nexport function FrameProvider({ frame, children }: Props) {\n const value = useContext(Context);\n if (value) throw new Error(\"`FrameProvider` can only be used once.\");\n return <Context.Provider value={{ frame }}>{children}</Context.Provider>;\n}\n\nexport function useFrame(): ContextValue {\n const value = useContext(Context);\n if (!value) throw new Error(\"`useFrame` can only be used within a `FrameProvider`.\");\n return value;\n}\n","import { useMediaQuery } from \"usehooks-ts\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useTheme() {\n const { theme: initialTheme } = useEntryKitConfig();\n const darkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\n const theme = initialTheme ?? (darkMode ? \"dark\" : \"light\");\n return theme;\n}\n","import \"@rainbow-me/rainbowkit/styles.css\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { RainbowKitProvider, midnightTheme } from \"@rainbow-me/rainbowkit\";\nimport { EntryKitConfig } from \"./config/output\";\nimport { Chain } from \"viem\";\nimport { useChains } from \"wagmi\";\nimport { getBundlerTransport } from \"./getBundlerTransport\";\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 <RainbowKitProvider\n // Prevent RainbowKit/Wagmi trying to switch chains after connection\n // https://github.com/rainbow-me/rainbowkit/blob/d76bb28a67609d9855b8045e5f5f4641dff1e032/packages/rainbowkit/src/wallets/useWalletConnectors.ts#L58-L67\n // https://github.com/wevm/wagmi/blob/cb58b1ea3ad40e77210f24eb598f9d2306db998c/packages/core/src/connectors/injected.ts#L176-L184\n initialChain={0}\n appInfo={{\n appName: config.appName,\n // TODO: learn more and disclaimer\n }}\n theme={midnightTheme({ borderRadius: \"none\" })}\n >\n <Context.Provider value={{ ...config, chain }}>{children}</Context.Provider>\n </RainbowKitProvider>\n );\n}\n\nexport function useEntryKitConfig(): ContextValue {\n const config = useContext(Context);\n if (!config) throw new Error(\"`useEntryKitConfig` can only be used within a `EntryKitProvider`.\");\n return config;\n}\n","import { 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\";\n\nexport function getBundlerTransport(chain: Chain) {\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n // TODO: bundler websocket\n const bundlerTransport = bundlerHttpUrl\n ? http(bundlerHttpUrl)\n : chain.id === 31337\n ? 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 })\n : null;\n if (!bundlerTransport) {\n throw new Error(`Chain ${chain.id} config did not include a bundler RPC URL.`);\n }\n return bundlerTransport;\n}\n","import {\n BundlerRpcSchema,\n EIP1193RequestFn,\n Hash,\n RpcUserOperationReceipt,\n Transport,\n createTransport,\n numberToHex,\n parseEther,\n} from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\nimport { TransportRequestFn } from \"./common\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { sendUserOperation } from \"./methods/sendUserOperation\";\nimport { ConnectedClient } from \"../../common\";\nimport { debug } from \"../debug\";\nimport { setBalance } from \"viem/actions\";\n\n// TODO: move to common package?\n\nexport function userOpExecutor({ executor }: { executor: ConnectedClient }): Transport {\n return () => {\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 [hash] = params;\n return receipts.get(hash) ?? null;\n }\n\n if (method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas(params);\n }\n\n throw new Error(`userOpExecutor: method \"${method}\" not supported`);\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 userClient = useConnectorClient({ chainId });\n const { address: userAddress } = useAccount();\n const initialUserAddress = useRef(userAddress);\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n\n return <ConnectedSteps userClient={userClient.data} initialUserAddress={initialUserAddress.current} />;\n}\n","import { useAccount } from \"wagmi\";\nimport { Button } from \"./ui/Button\";\nimport { useConnectModal } from \"@rainbow-me/rainbowkit\";\nimport { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useEffect, useState } from \"react\";\n\nexport function ConnectWallet() {\n const userAccount = useAccount();\n const { openConnectModal, connectModalOpen } = useConnectModal();\n const [hasAutoOpened, setHasAutoOpened] = useState(false);\n\n // automatically open connect modal once\n // TODO: remove this once we have more than \"connect wallet\" as an option\n useEffect(() => {\n if (!connectModalOpen && !hasAutoOpened) {\n openConnectModal?.();\n setHasAutoOpened(true);\n }\n }, [connectModalOpen, hasAutoOpened, openConnectModal]);\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 <Button\n key=\"create\"\n variant=\"secondary\"\n className=\"self-auto flex justify-center\"\n disabled={userAccount.status === \"connecting\"}\n onClick={openConnectModal}\n autoFocus\n >\n Connect wallet\n </Button>\n </div>\n </div>\n );\n}\n","/* eslint-disable max-len */\nimport { ButtonHTMLAttributes, DetailedHTMLProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\n\n// TODO: add support for async onClick, where pending is enabled automatically\n// TODO: add error state with popover/tooltip\n\ntype ButtonClassNameOptions = {\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n pending?: boolean;\n};\n\nconst buttonClassName = ({ variant = \"secondary\" }: ButtonClassNameOptions = {}) =>\n twMerge(\n \"group/button self-center leading-none outline-none border-4 border-transparent\",\n \"transition hover:brightness-125 active:brightness-150\",\n \"focus:border-orange-500\",\n \"aria-disabled:pointer-events-none aria-busy:pointer-events-none\",\n // TODO: better disabled state\n \"aria-disabled:opacity-50\",\n \"p-[.75em] font-medium\",\n {\n primary: twMerge(\"bg-orange-600 text-white focus:border-yellow-400\"),\n secondary: twMerge(\"bg-neutral-700 text-white focus:border-orange-500\"),\n tertiary: twMerge(\"bg-neutral-800 text-white focus:border-orange-500\"),\n }[variant],\n );\n\nexport type ButtonProps = {\n pending?: boolean;\n variant?: ButtonClassNameOptions[\"variant\"];\n};\n\nexport type Props = ButtonProps & DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;\n\nexport const Button = ({ pending, variant, type, className, children, disabled, ...props }: Props) => {\n return (\n <button\n type={type || \"button\"}\n className={twMerge(buttonClassName({ variant, pending }), className)}\n aria-busy={pending}\n aria-disabled={disabled}\n disabled={disabled || pending}\n {...props}\n >\n <span className=\"grid grid-cols-[1fr_auto_1fr] gap-2\">\n <span className=\"flex items-center justify-end text-[.75em]\">\n <span className=\"transition opacity-0 translate-x-2 group-aria-busy/button:opacity-100 group-aria-busy/button:translate-x-0 duration-100 group-aria-busy/button:duration-300\">\n <PendingIcon />\n </span>\n </span>\n <span>{children}</span>\n </span>\n </button>\n );\n};\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function PendingIcon({ className, ...props }: Props) {\n return (\n <svg\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em] animate-spin\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n","import { 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 dark:bg-neutral-800\" />\n )\n ) : null}\n </div>\n <div className=\"text-2xl text-white text-center\">{appName}</div>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { twMerge } from \"tailwind-merge\";\nimport { usePrerequisites } from \"./usePrerequisites\";\nimport { Wallet } from \"./Wallet\";\nimport { Allowance } from \"./quarry/Allowance\";\nimport { Session } from \"./Session\";\nimport { Step } from \"./common\";\nimport { Address } from \"viem\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { GasBalance } from \"./GasBalance\";\n\nexport type Props = {\n userClient: ConnectedClient;\n initialUserAddress: Address | undefined;\n};\n\nexport function ConnectedSteps({ userClient, initialUserAddress }: Props) {\n const { chain } = useEntryKitConfig();\n const paymaster = getPaymaster(chain);\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 } = 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: \"allowance\",\n isComplete: !!hasAllowance,\n content: (props) => <Allowance {...props} userAddress={userAddress} />,\n });\n }\n\n steps.push({\n id: \"session\",\n isComplete: !!isSpender && !!hasDelegation,\n content: (props) => (\n <Session {...props} userClient={userClient} registerSpender={!isSpender} registerDelegation={!hasDelegation} />\n ),\n });\n\n return steps;\n }, [hasAllowance, hasDelegation, hasGasBalance, isSpender, paymaster, sessionAddress, userAddress, userClient]);\n\n const [selectedStepId] = useState<null | string>(null);\n const nextStep = steps.find((step) => step.content != null && !step.isComplete);\n const completedSteps = steps.filter((step) => step.isComplete);\n const activeStep =\n (selectedStepId != null ? steps.find((step) => step.id === selectedStepId) : null) ??\n nextStep ??\n (completedSteps.length < steps.length ? completedSteps.at(-1) : null);\n const activeStepIndex = activeStep ? steps.indexOf(activeStep) : -1;\n\n return (\n <div\n className={twMerge(\n // steps.length === 2 ? \"min-h-[22rem]\" : \"min-h-[26rem]\",\n \"px-8 flex flex-col divide-y divide-neutral-800\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\",\n )}\n >\n {steps.map((step, i) => {\n const isActive = step === activeStep;\n const isExpanded = isActive || completedSteps.length === steps.length;\n const isDisabled = !step.isComplete && activeStepIndex !== -1 && i > activeStepIndex;\n return (\n <div key={step.id} className={twMerge(\"py-8 flex flex-col justify-center\", isActive ? \"flex-grow\" : null)}>\n <div className={twMerge(\"flex flex-col\", isDisabled ? \"opacity-30 pointer-events-none\" : null)}>\n {step.content({ isActive, isExpanded })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { parseEther } from \"viem\";\n\nexport type Step = {\n id: string;\n isComplete: boolean;\n content: (props: { isActive: boolean; isExpanded: boolean }) => ReactNode;\n};\n\n// TODO: move to chain config?\nexport const minGasBalance = parseEther(\"0.01\");\n\nexport type RelayChain = {\n bridgeUrl: string;\n};\nexport type RelayChains = {\n [chainId: number]: RelayChain | undefined;\n};\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { 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 const queryKey = [\"getAllowance\", client?.uid, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getAllowance({ client, userAddress }),\n }\n : { queryKey, enabled: false },\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, numberToHex } from \"viem\";\nimport { paymasterTables } from \"./common\";\nimport { getRecord, getStaticDataLocation } from \"@latticexyz/store/internal\";\nimport { getKeyTuple } from \"@latticexyz/protocol-parser/internal\";\nimport { setStorageAt } from \"viem/actions\";\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) {\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.Allowance,\n key: { user: userAddress },\n blockTag: \"pending\",\n });\n return record.allowance;\n}\n\nexport function getAllowanceSlot({ userAddress }: { userAddress: Address }) {\n return getStaticDataLocation(\n paymasterTables.Allowance.tableId,\n getKeyTuple(paymasterTables.Allowance, { user: userAddress }),\n );\n}\n\n// TODO: move this into some sort of store util to `setField`\nexport async function setAllowanceSlot({ client, userAddress, allowance }: GetAllowanceParams & { allowance: bigint }) {\n const paymaster = getPaymaster(client.chain);\n if (paymaster?.type !== \"quarry\") return;\n\n const slot = getStaticDataLocation(\n paymasterTables.Allowance.tableId,\n getKeyTuple(paymasterTables.Allowance, { user: userAddress }),\n );\n\n await setStorageAt(\n client.extend(() => ({ mode: \"anvil\" })),\n {\n address: paymaster.address,\n index: slot,\n value: numberToHex(allowance, { size: 32 }),\n },\n );\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: move the whole paymaster in here so we can just re-export ABI + MUD config\n\nexport const paymasterAbi = parseAbi([\n \"error SpenderSystem_AlreadyRegistered(address spender, address user)\",\n \"error SpenderSystem_HasOwnBalance(address spender)\",\n \"function registerSpender(address spender)\",\n]);\n\nexport const paymasterConfig = defineStore({\n namespaces: {\n root: {\n namespace: \"\",\n tables: {\n Allowance: {\n schema: {\n user: \"address\",\n allowance: \"uint256\",\n },\n key: [\"user\"],\n },\n Grantor: {\n schema: {\n grantor: \"address\",\n allowance: \"uint256\",\n },\n key: [\"grantor\"],\n },\n PassHolder: {\n schema: {\n user: \"address\",\n passId: \"bytes32\",\n lastRenewed: \"uint256\",\n lastClaimed: \"uint256\",\n },\n key: [\"user\", \"passId\"],\n },\n PassConfig: {\n schema: {\n passId: \"bytes32\",\n claimAmount: \"uint256\",\n claimInterval: \"uint256\",\n validityPeriod: \"uint256\",\n grantor: \"address\",\n },\n key: [\"passId\"],\n },\n Spender: {\n schema: {\n spender: \"address\",\n user: \"address\",\n },\n key: [\"spender\"],\n },\n SystemConfig: {\n schema: {\n entryPoint: \"address\",\n },\n key: [],\n },\n },\n },\n },\n});\n\nexport const paymasterTables = paymasterConfig.namespaces.root.tables;\n","import { Chain, Hex } from \"viem\";\n\nexport type Paymaster = {\n readonly type: \"simple\" | \"quarry\";\n readonly address: Hex;\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 };\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, 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 const queryKey = [\"getSpender\", client?.uid, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getSpender({ client, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\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 { 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 { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { queryOptions, useQuery } from \"@tanstack/react-query\";\nimport { getDelegation } from \"./getDelegation\";\n\nexport function getDelegationQueryOptions({\n client,\n worldAddress,\n userAddress,\n sessionAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n worldAddress: Address;\n userAddress: Address | undefined;\n sessionAddress: Address | undefined;\n}) {\n const queryKey = [\"getDelegation\", client?.uid, worldAddress, userAddress, sessionAddress];\n return queryOptions(\n client && userAddress && sessionAddress\n ? {\n queryKey,\n queryFn: () => getDelegation({ client, worldAddress, userAddress, sessionAddress }),\n }\n : { queryKey, enabled: false },\n );\n}\n\nexport function useDelegation(userAddress: Address | undefined, sessionAddress: Address | undefined) {\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n return useQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress }));\n}\n","import { Address, 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 { minGasBalance } from \"./common\";\nimport { getAllowanceQueryOptions } from \"./quarry/useAllowance\";\nimport { getSpenderQueryOptions } from \"./quarry/useSpender\";\nimport { getDelegationQueryOptions } from \"./useDelegation\";\nimport { QueryClient, queryOptions, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { Config, useClient, useConfig } from \"wagmi\";\nimport { Address, Chain, Client, Transport } from \"viem\";\nimport { getSessionAccountQueryOptions } from \"../useSessionAccount\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { getBalanceQueryOptions } from \"wagmi/query\";\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 const queryKey = [\"getPrerequisites\", client?.uid, userAddress];\n return queryOptions(\n client && userAddress\n ? {\n queryKey,\n async queryFn() {\n const paymaster = getPaymaster(client.chain);\n\n const {\n account: { address: sessionAddress },\n } = await queryClient.fetchQuery(getSessionAccountQueryOptions({ client, userAddress }));\n const [sessionBalance, allowance, spender, hasDelegation] = await Promise.all([\n !paymaster\n ? queryClient.fetchQuery(\n getBalanceQueryOptions(config, { chainId: client.chain.id, address: sessionAddress }),\n )\n : null,\n paymaster?.type === \"quarry\"\n ? queryClient.fetchQuery(getAllowanceQueryOptions({ client, userAddress }))\n : null,\n paymaster?.type === \"quarry\"\n ? queryClient.fetchQuery(getSpenderQueryOptions({ client, userAddress, sessionAddress }))\n : null,\n queryClient.fetchQuery(getDelegationQueryOptions({ client, worldAddress, userAddress, sessionAddress })),\n ]);\n // TODO: figure out better approach than null for allowance/spender when no quarry paymaster\n const hasAllowance = allowance == null || allowance >= minGasBalance;\n const isSpender = spender == null ? true : spender;\n const hasGasBalance = sessionBalance == null || sessionBalance.value >= minGasBalance;\n return {\n sessionAddress,\n hasAllowance,\n isSpender,\n hasGasBalance,\n hasDelegation,\n // we intentionally don't enforce an allowance/gas balance here\n complete: isSpender && hasDelegation,\n };\n },\n retry: false,\n }\n : { queryKey, enabled: 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 { UndefinedInitialDataOptions, UseQueryResult, queryOptions, 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 const queryKey = [\"getSessionAccount\", client?.uid, userAddress];\n return queryOptions<GetSessionAccountReturnType>(\n client && userAddress\n ? {\n queryKey,\n queryFn: () => getSessionAccount({ client, userAddress }),\n staleTime: Infinity,\n // TODO: replace with function to retry only connection errors\n retry: false,\n }\n : { queryKey, enabled: 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 { 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\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useShowMutationError(useDisconnect());\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Account</div>\n <div className=\"font-mono text-white\">{ens?.name ?? <TruncatedHex hex={userAddress} />}</div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={disconnectIsPending}\n onClick={() => {\n closeAccountModal();\n disconnect();\n }}\n >\n Sign out\n </Button>\n </div>\n {isExpanded ? (\n <p className=\"text-sm\">Each of your onchain actions in this app is associated with your account.</p>\n ) : null}\n </div>\n );\n}\n","import { Hex } from \"viem\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nexport function useENS(address: Hex | undefined) {\n const normalizedAddress = address?.toLowerCase();\n return useQuery<{\n address: string | undefined;\n name: string | undefined;\n displayName: string | undefined;\n avatar: string | undefined;\n }>({\n enabled: !!normalizedAddress,\n queryKey: [\"ens\", normalizedAddress],\n\n queryFn: async () => {\n // TODO: typed response\n const data = await fetch(`https://api.ensideas.com/ens/resolve/${normalizedAddress}`).then((res) => res.json());\n return {\n address: data.address ?? undefined,\n name: data.name ?? undefined,\n displayName: data.displayName ?? undefined,\n avatar: data.avatar ?? undefined,\n };\n },\n });\n}\n","import { Hex } from \"viem\";\n\nexport type Props = {\n hex: Hex;\n};\n\nexport function TruncatedHex({ hex }: Props) {\n if (hex.length <= 10) {\n return <span title={hex}>{hex}</span>;\n }\n\n return (\n <span title={hex}>\n <span className=\"after:select-none after:content-['…']\">{hex.slice(0, 6)}</span>\n <span className=\"tracking-[-1ch] text-transparent\">{hex.slice(6, -4)}</span>\n {hex.slice(-4)}\n </span>\n );\n}\n","import { 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 { Address, parseEther } from \"viem\";\nimport { useEntryKitConfig } from \"../../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { claimGasPass } from \"../../quarry/claimGasPass\";\nimport { setAllowanceSlot } from \"../../quarry/getAllowance\";\nimport { useClient } from \"wagmi\";\n\nexport function useClaimGasPass() {\n const queryClient = useQueryClient();\n const { chain } = useEntryKitConfig();\n const client = useClient({ chainId: chain.id });\n\n const mutationKey = [\"claimGasPass\", chain.id];\n return useMutation({\n retry: 0,\n mutationKey,\n mutationFn: async (userAddress: Address) => {\n if (chain.id === 31337) {\n if (!client) throw new Error(\"No client?\");\n await setAllowanceSlot({ client, userAddress, allowance: parseEther(\"1\") });\n } else {\n // TODO: handle case where you already have a pass?\n // TODO: get returned tx hashes to check if success\n await claimGasPass({ chain, userAddress });\n }\n\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"getAllowance\"] }),\n queryClient.invalidateQueries({ queryKey: [\"getPrerequisites\"] }),\n ]);\n },\n });\n}\n","import { Address, EIP1193RequestFn, Hex, Transport, http } from \"viem\";\n\nexport type QuarryPassIssuerRpcSchema = [\n {\n Method: \"quarry_issuePass\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n {\n Method: \"quarry_claimAllowance\";\n Parameters: [passId: Hex, receiver: Address];\n ReturnType: { message: string };\n },\n];\n\nexport function quarryPassIssuer(): Transport<\"http\", {}, EIP1193RequestFn<QuarryPassIssuerRpcSchema>> {\n return ({ chain }) => {\n if (!chain) throw new Error(\"No chain provided to issuer transport.\");\n\n const url = \"quarryPassIssuer\" in chain.rpcUrls ? chain.rpcUrls.quarryPassIssuer.http[0] : undefined;\n // TODO: add fallback for anvil to do what quarryPassIssuer does internally\n if (!url) throw new Error(`No \\`quarryPassIssuer\\` RPC URL found for chain ${chain.id}.`);\n\n return http(url)({ chain, retryCount: 0 });\n };\n}\n","import { Address, Chain } from \"viem\";\nimport { quarryPassIssuer } from \"./transports/quarryPassIssuer\";\nimport { debug } from \"./debug\";\n\nexport async function claimGasPass({ chain, userAddress }: { chain: Chain; userAddress: Address }) {\n const transport = quarryPassIssuer()({ chain });\n\n // TODO: handle case where you already have a pass?\n debug(\"Issuing gas pass to\", userAddress);\n await transport.request({\n method: \"quarry_issuePass\",\n params: [\"0x01\", userAddress],\n });\n\n debug(\"Claiming gas allowance for\", userAddress);\n await transport.request({\n method: \"quarry_claimAllowance\",\n params: [\"0x01\", 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 magnitude = Math.floor(parseFloat(formatted)).toString().length;\n return parseFloat(formatted).toLocaleString(\"en-US\", { maximumFractionDigits: Math.max(0, 6 - magnitude) });\n}\n","import { EthIcon } from \"../icons/EthIcon\";\nimport { formatBalance } from \"../formatBalance\";\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 { Hex } from \"viem\";\nimport { useAllowance } from \"./useAllowance\";\nimport { PendingIcon } from \"../../icons/PendingIcon\";\nimport { useClaimGasPass } from \"./useClaimGasPass\";\nimport { Button } from \"../../ui/Button\";\nimport { Balance } from \"../../ui/Balance\";\nimport { useEffect } from \"react\";\nimport { minGasBalance } from \"../common\";\nimport { useShowQueryError } from \"../../errors/useShowQueryError\";\nimport { useShowMutationError } from \"../../errors/useShowMutationError\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n userAddress: Hex;\n};\n\nexport function Allowance({ isActive, isExpanded, userAddress }: Props) {\n const allowance = useShowQueryError(useAllowance(userAddress));\n const claimGasPass = useShowMutationError(useClaimGasPass());\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (\n isActive &&\n claimGasPass.status === \"idle\" &&\n allowance.isSuccess &&\n allowance.data != null &&\n allowance.data < minGasBalance\n ) {\n claimGasPass.mutate(userAddress);\n }\n });\n return () => clearTimeout(timer);\n }, [allowance.data, allowance.isSuccess, claimGasPass, 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\" || claimGasPass.status === \"pending\"}\n onClick={() => claimGasPass.mutate(userAddress)}\n >\n Top up\n </Button>\n </div>\n {isExpanded ? <p className=\"text-sm\">Your allowance is used to pay for onchain computation.</p> : null}\n </div>\n );\n}\n","import { 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 { Hex, encodeFunctionData } from \"viem\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { getAction } from \"viem/utils\";\nimport { sendUserOperation, waitForUserOperationReceipt } from \"viem/account-abstraction\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { ConnectedClient, unlimitedDelegationControlId, worldAbi } from \"../common\";\nimport { paymasterAbi } from \"../quarry/common\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\nimport { defineCall } from \"../utils/defineCall\";\nimport { useClient } from \"wagmi\";\nimport { resourceToHex } from \"@latticexyz/common\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\";\nimport { callWithSignature } from \"../utils/callWithSignature\";\nimport { getPaymaster } from \"../getPaymaster\";\nimport { systemsConfig as worldSystemsConfig } from \"@latticexyz/world/mud.config\";\n\nexport function useSetupSession({ userClient }: { 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\");\n\n 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 } 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 signature = await signCall(opts);\n return getAction(\n sessionClient,\n viem_writeContract,\n \"writeContract\",\n )({\n address: opts.worldAddress,\n abi: CallWithSignatureAbi,\n functionName: \"callWithSignature\",\n args: [opts.userClient.account.address, opts.systemId, opts.callData, signature],\n } as never);\n}\n","import { Address, Chain, Client, Hex, OneOf, Transport, toHex } from \"viem\";\nimport { signTypedData } from \"viem/actions\";\nimport { callWithSignatureTypes } from \"@latticexyz/world-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 { Button } from \"../ui/Button\";\nimport { useSetupSession } from \"./useSetupSession\";\nimport { ConnectedClient } from \"../common\";\nimport { useEffect } from \"react\";\nimport { useSessionClient } from \"../useSessionClient\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userClient: ConnectedClient;\n registerSpender: boolean;\n registerDelegation: boolean;\n};\n\nexport function Session({ isActive, isExpanded, userClient, registerSpender, registerDelegation }: Props) {\n const sessionClient = useShowQueryError(useSessionClient(userClient.account.address));\n const setup = useShowMutationError(useSetupSession({ userClient }));\n const hasSession = !registerDelegation && !registerDelegation;\n\n useEffect(() => {\n // There seems to be a tanstack-query bug(?) where multiple simultaneous renders loses\n // state between the two mutations. They're not treated as shared state but rather\n // individual mutations, even though the keys match. And the one we want the status of\n // seems to stay pending. This is sorta resolved by triggering this after a timeout.\n const timer = setTimeout(() => {\n if (isActive && setup.status === \"idle\" && sessionClient.data && !hasSession) {\n setup.mutate({\n sessionClient: sessionClient.data,\n registerSpender,\n registerDelegation,\n });\n }\n });\n return () => clearTimeout(timer);\n }, [hasSession, isActive, registerDelegation, registerSpender, sessionClient, setup]);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Session</div>\n <div className=\"font-mono text-white\">{hasSession ? \"Enabled\" : \"Set up\"}</div>\n </div>\n {hasSession ? (\n <Button variant=\"tertiary\" className=\"flex-shrink-0 text-sm p-1 w-28\" autoFocus={isActive} disabled>\n Enabled\n </Button>\n ) : (\n <Button\n variant={isActive ? \"primary\" : \"tertiary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n autoFocus={isActive}\n pending={!sessionClient.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 { 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 const queryKey = [\"getSessionClient\", client?.uid, userAddress, worldAddress];\n return queryOptions<SessionClient>(\n userAddress\n ? {\n queryKey,\n async queryFn() {\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 : { queryKey, enabled: 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\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 { 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 { getAction } from \"viem/utils\";\nimport { estimateFeesPerGas } from \"viem/actions\";\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, rhodolite, pyrope chains\n // because viem sets fees way too high by default\n // https://github.com/wevm/viem/blob/253b1072ad9fe36a0e0491e173c85a6d69209ada/src/account-abstraction/actions/bundler/prepareUserOperation.ts#L436-L457\n if ([690, 17069, 17420, 695569].includes(client.chain.id)) {\n // TODO: move to fee ref or similar approach\n return () => getAction(client, estimateFeesPerGas, \"estimateFeesPerGas\")({ chain: client.chain });\n }\n}\n","import { Hex } from \"viem\";\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, minGasBalance } from \"./common\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { useShowMutationError } from \"../errors/useShowMutationError\";\nimport { useShowQueryError } from \"../errors/useShowQueryError\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n sessionAddress: Hex;\n};\n\nexport function GasBalance({ isActive, isExpanded, sessionAddress }: Props) {\n const { chain } = useEntryKitConfig();\n\n const balance = useShowQueryError(useBalance({ chainId: chain.id, address: sessionAddress }));\n useWatchBlockNumber({ onBlockNumber: () => balance.refetch() });\n\n const setBalance = useShowMutationError(useSetBalance());\n\n const relayChain = (relayChains as RelayChains)[chain.id];\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: minGasBalance + (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 })}`}\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 className=\"font-mono text-white\">\n <TruncatedHex hex={sessionAddress} />\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: [\"getPrerequisites\"] }),\n ]);\n\n return null;\n },\n });\n}\n","import { SVGProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = SVGProps<SVGSVGElement>;\n\nexport function IconSVG({ className, children, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {children}\n </svg>\n );\n}\n","import { IconSVG, Props } from \"./IconSVG\";\n\nexport function CloseIcon(props: Props) {\n return (\n <IconSVG strokeWidth=\"2\" stroke=\"currentColor\" {...props}>\n <path\n d=\"M6 18L18 6M6 6L18 18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { 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}\n onClick={openAccountModal}\n >\n <span className=\"pointer-events-none inline-grid place-items-center -ml-3\">\n <span\n className={twMerge(\n \"col-start-1 row-start-1 leading-none\",\n \"scale-100 opacity-100 transition duration-300\",\n \"group-aria-busy:scale-125 group-aria-busy:opacity-0\",\n )}\n >\n <Logo />\n </span>\n <span\n aria-hidden\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"scale-50 opacity-0 transition duration-300 delay-50\",\n \"group-aria-busy:scale-100 group-aria-busy:opacity-100\",\n )}\n >\n <PendingIcon />\n </span>\n </span>\n <span className=\"font-medium\">{buttonLabel}</span>\n </button>\n )}\n </Shadow>\n );\n}\n","import { Hex } from \"viem\";\nimport { useENS } from \"./useENS\";\nimport { Logo } from \"./icons/Logo\";\nimport { TruncatedHex } from \"./ui/TruncatedHex\";\nimport { usePreloadImage } from \"./usePreloadImage\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n address: Hex;\n};\n\nexport function AccountName({ address }: Props) {\n const { data: ens } = useENS(address);\n const avatar = usePreloadImage(ens?.avatar);\n\n return (\n <>\n <span className=\"flex-shrink-0 w-6 h-6 -my-1 -mx-0.5 grid place-items-center\">\n <img\n src={ens?.avatar && avatar.isSuccess ? ens.avatar : undefined}\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"inline-flex w-full h-full rounded-full bg-black/10 dark:bg-white/10 bg-cover bg-no-repeat bg-center\",\n \"transtion duration-300\",\n avatar.isSuccess ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <Logo\n className={twMerge(\n \"col-start-1 row-start-1 text-orange-500\",\n \"transition duration-300\",\n ens && (!ens.avatar || avatar.isError) ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n </span>\n <span className=\"flex-grow\">{ens?.name ?? <TruncatedHex hex={address} />}</span>\n </>\n );\n}\n","// Exported `useSessionClient` variant and only provides the session client once all prerequisites are met.\n\nimport { useConnectorClient } from \"wagmi\";\nimport { useSessionClient } from \"./useSessionClient\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { usePrerequisites } from \"./onboarding/usePrerequisites\";\nimport { UseQueryResult } from \"@tanstack/react-query\";\nimport { SessionClient } from \"./common\";\n\nexport function useSessionClientReady(): UseQueryResult<SessionClient | undefined> {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n if (userClient.error) console.error(\"Error retrieving user client\", userClient.error);\n\n const userAddress = userClient.data?.account.address;\n const prerequisites = usePrerequisites(userAddress);\n const sessionClient = useSessionClient(userAddress);\n\n if (!userClient.isSuccess) return { ...userClient, data: undefined } as never;\n if (!prerequisites.isSuccess || !prerequisites.data.complete) return { ...prerequisites, data: undefined } as never;\n return sessionClient;\n}\n","import { Chain, Transport } from \"viem\";\nimport { connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { Config, CreateConfigParameters, createConfig } from \"wagmi\";\nimport { getWallets } from \"./getWallets\";\n\nexport type CreateWagmiConfigOptions<\n chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport> = Record<chains[number][\"id\"], Transport>,\n> = {\n readonly chainId: number;\n readonly chains: chains;\n readonly transports: transports;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & Pick<CreateConfigParameters<chains, transports>, \"pollingInterval\">;\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n>(config: CreateWagmiConfigOptions<chains, transports>): Config<chains, transports> {\n const wallets = getWallets(config);\n const connectors = connectorsForWallets(wallets, {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n\n return createConfig({\n connectors,\n chains: config.chains,\n transports: config.transports,\n pollingInterval: config.pollingInterval,\n }) as never;\n}\n","import { WalletList, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\n\nexport function getWallets(_config: { readonly chainId: number }): WalletList {\n const { wallets: defaultWallets } = getDefaultWallets();\n return [\n // TODO: passkey wallet\n ...defaultWallets,\n ];\n}\n","import { WalletList, connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { getWallets } from \"./getWallets\";\nimport { CreateConnectorFn } from \"wagmi\";\n\nexport function getConnectors({\n wallets,\n ...config\n}: {\n readonly chainId: number;\n /**\n * WalletConnect project ID, obtained from your WalletConnect dashboard.\n */\n // TODO: make optional and hide wallet options if so?\n readonly walletConnectProjectId: string;\n readonly appName: string;\n} & { readonly wallets?: WalletList }): CreateConnectorFn[] {\n return connectorsForWallets(wallets ?? getWallets(config), {\n appName: config.appName,\n projectId: config.walletConnectProjectId,\n });\n}\n","import { 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,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,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,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;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","names":["useEffect","createContext","useContext","entryPoint07Address","debug","debug","entryPoint07Address","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","useState","jsx","jsxs","useEffect","useMemo","useRef","useState","twMerge","parseEther","useQuery","numberToHex","numberToHex","useQuery","useClient","queryOptions","useQuery","getRecord","getRecord","queryOptions","useClient","queryOptions","useQuery","getRecord","parseAbi","getRecord","queryOptions","queryOptions","useQuery","useClient","useClient","queryOptions","useQuery","createStore","store","privateKeyToAccount","store","queryOptions","queryOptions","useClient","useQuery","useQuery","jsx","jsxs","createStore","store","error","useEffect","error","jsx","jsxs","parseEther","useQueryClient","http","debug","useClient","useQueryClient","parseEther","twMerge","jsx","jsxs","formatEther","jsx","jsxs","useEffect","useEffect","error","jsx","jsxs","claimGasPass","useEffect","useMutation","useQueryClient","getAction","sendUserOperation","waitForTransactionReceipt","useClient","resourceToHex","getAction","getRecord","getAction","getAction","useQueryClient","useClient","useMutation","getAction","sendUserOperation","resourceToHex","waitForTransactionReceipt","useEffect","useClient","queryOptions","useQuery","useQueryClient","getAction","queryOptions","useQueryClient","useClient","useQuery","jsx","jsxs","useEffect","useQueryClient","useMutation","setBalance","useClient","useQueryClient","useClient","useMutation","setBalance","jsx","jsxs","setBalance","jsx","useEffect","useRef","useMemo","steps","useState","twMerge","useRef","jsx","useAccount","twMerge","jsx","jsx","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","useAccount","useConnectorClient","useConnectorClient","connectorsForWallets","connectorsForWallets"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/entrykit",
3
- "version": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f",
3
+ "version": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545",
4
4
  "description": "User onboarding flows for MUD apps",
5
5
  "repository": {
6
6
  "type": "git",
@@ -43,13 +43,13 @@
43
43
  "usehooks-ts": "^3.1.0",
44
44
  "webauthn-p256": "0.0.10",
45
45
  "zustand": "^4.5.2",
46
- "@latticexyz/common": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f",
47
- "@latticexyz/config": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f",
48
- "@latticexyz/paymaster": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f",
49
- "@latticexyz/protocol-parser": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f",
50
- "@latticexyz/store": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f",
51
- "@latticexyz/world": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f",
52
- "@latticexyz/world-module-callwithsignature": "2.2.22-d83a0fd5283b7bea7e9a5372ea3c45ab9aea350f"
46
+ "@latticexyz/common": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545",
47
+ "@latticexyz/config": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545",
48
+ "@latticexyz/paymaster": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545",
49
+ "@latticexyz/protocol-parser": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545",
50
+ "@latticexyz/store": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545",
51
+ "@latticexyz/world": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545",
52
+ "@latticexyz/world-module-callwithsignature": "2.2.22-f0c0b982573f9953e1c726c0bef91671efaaa545"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@tanstack/react-query": "^5.56.2",