@latticexyz/entrykit 2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30 → 2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10

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.
@@ -625,10 +625,6 @@ video {
625
625
  display: block;
626
626
  }
627
627
 
628
- .inline-block {
629
- display: inline-block;
630
- }
631
-
632
628
  .flex {
633
629
  display: flex;
634
630
  }
@@ -1431,7 +1427,7 @@ video {
1431
1427
  --tw-text-opacity: 1;
1432
1428
  color: rgb(255 255 255 / var(--tw-text-opacity));
1433
1429
  }
1434
- `;import{useResizeObserver as Qt}from"usehooks-ts";import{mergeRefs as Yt}from"react-merge-refs";import{createContext as Lt,useContext as Bt}from"react";import{jsx as Ft}from"react/jsx-runtime";var Ie=Lt(null);function He({frame:e,children:t}){if(Bt(Ie))throw new Error("`FrameProvider` can only be used once.");return Ft(Ie.Provider,{value:{frame:e},children:t})}import{useMediaQuery as Gt}from"usehooks-ts";import"@rainbow-me/rainbowkit/styles.css";import{createContext as Wt,useContext as Re}from"react";import{RainbowKitProvider as Ut,lightTheme as Ne,midnightTheme as Ee}from"@rainbow-me/rainbowkit";import{jsx as Te}from"react/jsx-runtime";var se=Wt(null);function Oe({config:e,children:t}){if(Re(se))throw new Error("`EntryKitProvider` can only be used once.");return Te(Ut,{initialChain:e.chainId,appInfo:{appName:e.appInfo?.name},theme:e.theme==="light"?Ne({borderRadius:"none"}):e.theme==="dark"?Ee({borderRadius:"none"}):{lightMode:Ne({borderRadius:"none"}),darkMode:Ee({borderRadius:"none"})},children:Te(se.Provider,{value:e,children:t})})}function u(){let e=Re(se);if(!e)throw new Error("`useEntryKitConfig` can only be used within a `EntryKitProvider`.");return e}function De(){let{theme:e}=u(),t=Gt("(prefers-color-scheme: dark)");return e??(t?"dark":"light")}import{jsx as I,jsxs as $t}from"react/jsx-runtime";function Xt({onSize:e,...t}){let n=Ke(null);return Qt({ref:n,onResize:e}),I("div",{ref:n,...t,style:{...t.style,display:"inline-block"}})}var K=Vt(function({mode:t,children:n},r){let a=Ke(null),[i,s]=ze(!1),o=i?a.current:null,[l,c]=ze({width:void 0,height:void 0}),d=o?.contentDocument,p=De();_t(()=>{d&&d.body.setAttribute("data-theme",p)},[d,p]);let f=t==="modal"?{all:"unset",display:"block",position:"fixed",inset:"0",width:"100%",height:"100%",zIndex:"2147483646"}:l.width&&l.height?{all:"unset",display:"inline-block",width:`${l.width}px`,height:`${l.height}px`}:{all:"unset",display:"block",position:"fixed",inset:"0",width:"100%",height:"100%",opacity:0,pointerEvents:"none"};return I("iframe",{ref:Yt([r,a]),style:f,onLoad:()=>s(!0),srcDoc:"<!doctype html><title>\u2026</title>",children:d?qt.createPortal($t(He,{frame:o,children:[I("div",{children:t==="modal"?n:I(Xt,{onSize:c,children:n})}),I("style",{dangerouslySetInnerHTML:{__html:Me}})]}),d.body):null})});import{twMerge as Le}from"tailwind-merge";import{jsx as k,jsxs as en}from"react/jsx-runtime";function Be({open:e,onOpenChange:t,children:n}){return k(jt,{open:e,onOpenChange:t,children:k(Jt,{children:en(K,{mode:"modal",children:[k("div",{className:Le("fixed inset-0","bg-neutral-800/85","animate-in animate-duration-300 fade-in")}),k("div",{className:Le("fixed inset-0","grid items-end sm:items-center","animate-in animate-duration-300 fade-in slide-in-from-bottom-16"),children:k("div",{children:k(Zt,{className:"outline-none w-full max-w-[26rem] mx-auto","aria-describedby":void 0,onOpenAutoFocus:r=>{r.preventDefault()},children:n})})})]})})})}import{useCallback as ce,useMemo as tn}from"react";import{useStore as nn}from"zustand";import{createStore as rn}from"zustand/vanilla";var L=rn(()=>({open:!1}));function y(){let e=nn(L,a=>a.open),t=ce(()=>{L.setState({open:!0})},[]),n=ce(()=>{L.setState({open:!1})},[]),r=ce(a=>{L.setState({open:a})},[]);return tn(()=>({accountModalOpen:e,openAccountModal:t,closeAccountModal:n,toggleAccountModal:r}),[e,t,n,r])}import{twMerge as Mt}from"tailwind-merge";import{useConnectorClient as ea}from"wagmi";import{useAccount as rr}from"wagmi";import{twMerge as B}from"tailwind-merge";import{twMerge as an}from"tailwind-merge";import{jsx as Fe,jsxs as on}from"react/jsx-runtime";function x({className:e,...t}){return on("svg",{className:an("-my-[0.125em] h-[1.25em] w-[1.25em] animate-spin",e),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",...t,children:[Fe("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),Fe("path",{className:"opacity-75",fill:"currentColor",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"})]})}import{jsx as H,jsxs as cn}from"react/jsx-runtime";var sn=({variant:e="primary"}={})=>B("group self-center leading-none outline-none border-4 border-transparent","transition hover:brightness-125 active:brightness-150","focus:border-orange-500","aria-disabled:pointer-events-none aria-busy:pointer-events-none","aria-disabled:opacity-50","p-[.75em] font-medium",{primary:B("bg-neutral-700 text-white"),secondary:B("bg-neutral-800 text-white")}[e]),g=({pending:e,variant:t,type:n,className:r,children:a,disabled:i,...s})=>H("button",{type:n||"button",className:B(sn({variant:t,pending:e}),r),"aria-busy":e,"aria-disabled":i,disabled:i||e,...s,children:cn("span",{className:"grid grid-cols-[1fr_auto_1fr] gap-2",children:[H("span",{className:"flex items-center justify-end text-[.75em]",children:H("span",{className:"transition opacity-0 translate-x-2 group-aria-busy:opacity-100 group-aria-busy:translate-x-0 duration-100 group-aria-busy:duration-300",children:H(x,{})})}),H("span",{children:a})]})});import{useConnectModal as ar}from"@rainbow-me/rainbowkit";import{useMutation as et}from"@tanstack/react-query";import{useConnectors as Jn}from"wagmi";import{createClient as Vn,custom as _n,getAddress as qn,numberToHex as $e,SwitchChainError as Qn}from"viem";import{ChainNotConfiguredError as Yn,createConnector as Xn}from"wagmi";import{createStore as dn}from"zustand/vanilla";import{persist as ln}from"zustand/middleware";var m=dn(ln(()=>({publicKeys:{},addresses:{},activeCredential:null}),{name:"mud:passkey:cache"}));function pn(e){e.key===m.persist.getOptions().name&&m.persist.rehydrate()}window.addEventListener("storage",pn);import{smartAccountActions as $n}from"permissionless/clients";import{toWebAuthnAccount as Pn}from"viem/account-abstraction";import{BaseError as un}from"abitype";import{pad as mn,encodeFunctionData as de,hashMessage as fn,hashTypedData as Ue,encodeAbiParameters as Ge,stringToHex as yn,size as gn,encodePacked as hn,parseSignature as wn}from"viem";import{entryPoint07Abi as bn,entryPoint07Address as xn,getUserOperationHash as vn,toSmartAccount as Cn}from"viem/account-abstraction";import{readContract as We}from"viem/actions";import{parseSignature as kn}from"webauthn-p256";async function U(e){let{client:t,owners:n,nonce:r=0n}=e,a=e.address,i={abi:bn,address:xn,version:"0.7"},s={abi:Sn,address:"0x356336adA1619BeC1Ae4E6D94Dd9c0490DA414a8"};if(!n.length)throw new Error("`owners` must have at least one account.");function o(d){return d.type==="webAuthn"?d.publicKey:mn(d.address)}let l=e.signer??n[0],c=n.indexOf(l);if(c===-1)throw new Error("`signer` must be one of `owners`.");return Cn({client:t,entryPoint:i,extend:{__isCoinbaseSmartAccount:!0,abi:W,factory:s,signer:l},async encodeCalls(d){return d.length===1?de({abi:W,functionName:"execute",args:[d[0].to,d[0].value??0n,d[0].data??"0x"]}):de({abi:W,functionName:"executeBatch",args:[d.map(p=>({data:p.data??"0x",target:p.to,value:p.value??0n}))]})},async getAddress(){return a??=await We(t,{...s,functionName:"getAddress",args:[n.map(o),r]}),a},async getFactoryArgs(){let d=de({abi:s.abi,functionName:"createAccount",args:[n.map(o),r]});return{factory:s.address,factoryData:d}},async getStubSignature(){return l.type==="webAuthn"?"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000":N({signature:"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c",ownerIndex:c})},async sign(d){let p=await this.getAddress(),f=le({address:p,chainId:t.chain.id,hash:d.hash}),h=await F({hash:f,owner:l});return N({signature:h,ownerIndex:c})},async signMessage(d){let{message:p}=d,f=await this.getAddress(),h=le({address:f,chainId:t.chain.id,hash:fn(p)}),M=await F({hash:h,owner:l});return N({signature:M,ownerIndex:c})},async signTypedData(d){let{domain:p,types:f,primaryType:h,message:M}=d,ie=await this.getAddress(),Dt=le({address:ie,chainId:t.chain.id,hash:Ue({domain:p,message:M,primaryType:h,types:f})}),zt=await F({hash:Dt,owner:l});return N({signature:zt,ownerIndex:c})},async signUserOperation(d){let{chainId:p=t.chain.id,...f}=d,h=await this.getAddress(),M=vn({chainId:p,entryPointAddress:i.address,entryPointVersion:i.version,userOperation:{...f,sender:h}}),ie=await F({hash:M,owner:l});return N({signature:ie,ownerIndex:c})},userOperation:{async estimateGas(d){if(l.type==="webAuthn")return{verificationGasLimit:BigInt(Math.max(Number(d.verificationGasLimit??0n),8e5))}}},async isOwner(d){return await We(t,{abi:W,address:await this.getAddress(),functionName:"isOwnerBytes",args:[o(d)]})}})}async function F({hash:e,owner:t}){if(t.type==="webAuthn"){let{signature:n,webauthn:r}=await t.sign({hash:e});return An({signature:n,webauthn:r})}if(t.sign)return t.sign({hash:e});throw new un("`owner` does not support raw sign.")}function le({address:e,chainId:t,hash:n}){return Ue({domain:{chainId:t,name:"Coinbase Smart Wallet",verifyingContract:e,version:"1"},types:{CoinbaseSmartWalletMessage:[{name:"hash",type:"bytes32"}]},primaryType:"CoinbaseSmartWalletMessage",message:{hash:n}})}function An({webauthn:e,signature:t}){let{r:n,s:r}=kn(t);return Ge([{components:[{name:"authenticatorData",type:"bytes"},{name:"clientDataJSON",type:"bytes"},{name:"challengeIndex",type:"uint256"},{name:"typeIndex",type:"uint256"},{name:"r",type:"uint256"},{name:"s",type:"uint256"}],type:"tuple"}],[{authenticatorData:e.authenticatorData,clientDataJSON:yn(e.clientDataJSON),challengeIndex:BigInt(e.challengeIndex),typeIndex:BigInt(e.typeIndex),r:n,s:r}])}function N(e){let{ownerIndex:t}=e,n=(()=>{if(gn(e.signature)!==65)return e.signature;let r=wn(e.signature);return hn(["bytes32","bytes32","uint8"],[r.r,r.s,r.yParity===0?27:28])})();return Ge([{components:[{name:"ownerIndex",type:"uint8"},{name:"signatureData",type:"bytes"}],type:"tuple"}],[{ownerIndex:t,signatureData:n}])}var W=[{inputs:[],stateMutability:"nonpayable",type:"constructor"},{inputs:[{name:"owner",type:"bytes"}],name:"AlreadyOwner",type:"error"},{inputs:[],name:"Initialized",type:"error"},{inputs:[{name:"owner",type:"bytes"}],name:"InvalidEthereumAddressOwner",type:"error"},{inputs:[{name:"key",type:"uint256"}],name:"InvalidNonceKey",type:"error"},{inputs:[{name:"owner",type:"bytes"}],name:"InvalidOwnerBytesLength",type:"error"},{inputs:[],name:"LastOwner",type:"error"},{inputs:[{name:"index",type:"uint256"}],name:"NoOwnerAtIndex",type:"error"},{inputs:[{name:"ownersRemaining",type:"uint256"}],name:"NotLastOwner",type:"error"},{inputs:[{name:"selector",type:"bytes4"}],name:"SelectorNotAllowed",type:"error"},{inputs:[],name:"Unauthorized",type:"error"},{inputs:[],name:"UnauthorizedCallContext",type:"error"},{inputs:[],name:"UpgradeFailed",type:"error"},{inputs:[{name:"index",type:"uint256"},{name:"expectedOwner",type:"bytes"},{name:"actualOwner",type:"bytes"}],name:"WrongOwnerAtIndex",type:"error"},{anonymous:!1,inputs:[{indexed:!0,name:"index",type:"uint256"},{indexed:!1,name:"owner",type:"bytes"}],name:"AddOwner",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"index",type:"uint256"},{indexed:!1,name:"owner",type:"bytes"}],name:"RemoveOwner",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"implementation",type:"address"}],name:"Upgraded",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"REPLAYABLE_NONCE_KEY",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{name:"owner",type:"address"}],name:"addOwnerAddress",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"x",type:"bytes32"},{name:"y",type:"bytes32"}],name:"addOwnerPublicKey",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"functionSelector",type:"bytes4"}],name:"canSkipChainIdValidation",outputs:[{name:"",type:"bool"}],stateMutability:"pure",type:"function"},{inputs:[],name:"domainSeparator",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"eip712Domain",outputs:[{name:"fields",type:"bytes1"},{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"},{name:"salt",type:"bytes32"},{name:"extensions",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[],name:"entryPoint",outputs:[{name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{name:"target",type:"address"},{name:"value",type:"uint256"},{name:"data",type:"bytes"}],name:"execute",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{components:[{name:"target",type:"address"},{name:"value",type:"uint256"},{name:"data",type:"bytes"}],name:"calls",type:"tuple[]"}],name:"executeBatch",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{name:"calls",type:"bytes[]"}],name:"executeWithoutChainIdValidation",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{components:[{name:"sender",type:"address"},{name:"nonce",type:"uint256"},{name:"initCode",type:"bytes"},{name:"callData",type:"bytes"},{name:"callGasLimit",type:"uint256"},{name:"verificationGasLimit",type:"uint256"},{name:"preVerificationGas",type:"uint256"},{name:"maxFeePerGas",type:"uint256"},{name:"maxPriorityFeePerGas",type:"uint256"},{name:"paymasterAndData",type:"bytes"},{name:"signature",type:"bytes"}],name:"userOp",type:"tuple"}],name:"getUserOpHashWithoutChainId",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"implementation",outputs:[{name:"$",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{name:"owners",type:"bytes[]"}],name:"initialize",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{name:"account",type:"address"}],name:"isOwnerAddress",outputs:[{name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{name:"account",type:"bytes"}],name:"isOwnerBytes",outputs:[{name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{name:"x",type:"bytes32"},{name:"y",type:"bytes32"}],name:"isOwnerPublicKey",outputs:[{name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{name:"hash",type:"bytes32"},{name:"signature",type:"bytes"}],name:"isValidSignature",outputs:[{name:"result",type:"bytes4"}],stateMutability:"view",type:"function"},{inputs:[],name:"nextOwnerIndex",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{name:"index",type:"uint256"}],name:"ownerAtIndex",outputs:[{name:"",type:"bytes"}],stateMutability:"view",type:"function"},{inputs:[],name:"ownerCount",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"proxiableUUID",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{name:"index",type:"uint256"},{name:"owner",type:"bytes"}],name:"removeLastOwner",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"index",type:"uint256"},{name:"owner",type:"bytes"}],name:"removeOwnerAtIndex",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"removedOwnersCount",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{name:"hash",type:"bytes32"}],name:"replaySafeHash",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{name:"newImplementation",type:"address"},{name:"data",type:"bytes"}],name:"upgradeToAndCall",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{components:[{name:"sender",type:"address"},{name:"nonce",type:"uint256"},{name:"initCode",type:"bytes"},{name:"callData",type:"bytes"},{name:"callGasLimit",type:"uint256"},{name:"verificationGasLimit",type:"uint256"},{name:"preVerificationGas",type:"uint256"},{name:"maxFeePerGas",type:"uint256"},{name:"maxPriorityFeePerGas",type:"uint256"},{name:"paymasterAndData",type:"bytes"},{name:"signature",type:"bytes"}],name:"userOp",type:"tuple"},{name:"userOpHash",type:"bytes32"},{name:"missingAccountFunds",type:"uint256"}],name:"validateUserOp",outputs:[{name:"validationData",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}],Sn=[{inputs:[{name:"implementation_",type:"address"}],stateMutability:"payable",type:"constructor"},{inputs:[],name:"OwnerRequired",type:"error"},{inputs:[{name:"owners",type:"bytes[]"},{name:"nonce",type:"uint256"}],name:"createAccount",outputs:[{name:"account",type:"address"}],stateMutability:"payable",type:"function"},{inputs:[{name:"owners",type:"bytes[]"},{name:"nonce",type:"uint256"}],name:"getAddress",outputs:[{name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"implementation",outputs:[{name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"initCodeHash",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"}];async function E(e,t){let{publicKeys:n}=m.getState(),r=n[t];if(!r)throw new Error("No public key found for passkey credential.");let i=[Pn({credential:{id:t,publicKey:r}})];return await U({client:e,owners:i})}import{bytesToHex as Dn,hashMessage as zn}from"viem";import{sign as Kn}from"webauthn-p256";import{bytesToHex as Mn,hexToBytes as Ve}from"webauthn-p256";import{concatBytes as In,utf8ToBytes as Hn}from"@noble/curves/abstract/utils";async function G(e){let{authenticatorData:t,challengeIndex:n,clientDataJSON:r,typeIndex:a,userVerificationRequired:i}=e,s=a||r.indexOf('"type"'),o=n||r.indexOf('"challenge"'),l=Ve(t);if(l.length<37)throw new Error("Invalid authenticatorData");let c=l[32];if((c&1)!==1)throw new Error("Invalid authenticatorData");if(i&&(c&4)!==4)throw new Error("Invalid authenticatorData");if((c&8)!==8&&(c&16)===16)throw new Error("Invalid authenticatorData");let d='"type":"webauthn.get"';if(d!==r.slice(Number(s),d.length+1))throw new Error("Invalid clientDataJSON");if(!r.slice(Number(o)).match(/^"challenge":"(.*?)"/))throw new Error("Invalid clientDataJSON");let f=new Uint8Array(await crypto.subtle.digest("SHA-256",Hn(r))),h=new Uint8Array(await crypto.subtle.digest("SHA-256",In(Ve(t),f)));return Mn(h)}import{sign as En}from"webauthn-p256";import{parseSignature as Nn,serializePublicKey as _e}from"webauthn-p256";import{secp256r1 as qe}from"@noble/curves/p256";function pe(e){let{r:t,s:n}=Nn(e.signatureHex),r=new qe.Signature(t,n).addRecoveryBit(1).recoverPublicKey(e.messageHash.slice(2)),a=new qe.Signature(t,n).addRecoveryBit(0).recoverPublicKey(e.messageHash.slice(2));return[_e(r),_e(a)]}import{hashMessage as Tn}from"viem";function Rn([e,t]){return On([...pe(e),...pe(t)])}async function Qe(e){let t=Tn(e.signatureHex),{signature:n,webauthn:r,raw:a}=await En({credentialId:e.credentialId,hash:t}),i=await G(r),s=Rn([e,{signatureHex:n,messageHash:i}]);if(s)return{publicKey:s,credential:a}}function On(e){let t=new Set;for(let n of e){if(t.has(n))return n;t.add(n)}}async function ue(){let e=Dn(crypto.getRandomValues(new Uint8Array(256))),t=zn(e),{signature:n,webauthn:r,raw:a}=await Kn({hash:t}),i=await(async()=>{let s=m.getState().publicKeys[a.id];if(s)return s;let o=await G(r),l=await Qe({credentialId:a.id,messageHash:o,signatureHex:n});if(!l)throw new Error("recovery failed");if(l.credential.id!==a.id)throw new Error("wrong credential");return m.setState(c=>({publicKeys:{...c.publicKeys,[a.id]:l.publicKey}})),l.publicKey})();return console.log("recovered passkey",a.id,i),m.setState(()=>({activeCredential:a.id})),{id:a.id,publicKey:i,raw:a}}import{createCredential as Ln}from"webauthn-p256";async function Ye(){let e=await Ln({name:"MUD Account"});return console.log("created passkey",e),m.setState(t=>({activeCredential:e.id,publicKeys:{...t.publicKeys,[e.id]:e.publicKey}})),e}import{resourceToHex as Bn}from"@latticexyz/common";import{parseAbi as Fn}from"viem";import Wn from"@latticexyz/world/mud.config";var V={pollingInterval:250},T=Bn({type:"system",namespace:"",name:"unlimited"}),Xe=Wn.namespaces.world.tables,me=Fn(["function registerDelegation(address delegatee, bytes32 delegationControlId, bytes initCallData)"]);import{createBundlerClient as Un}from"viem/account-abstraction";var Gn=new Set([31337,17420,17069,690]);function _({paymasterAddress:e,...t}){let n=t.chain??t.client?.chain;return Un({...V,paymaster:{getPaymasterData:async()=>({paymaster:e,paymasterData:"0x"})},userOperation:{estimateFeesPerGas:n&&Gn.has(n.id)?async()=>({maxFeePerGas:100000n,maxPriorityFeePerGas:0n}):void 0},...t})}import{observer as jn}from"@latticexyz/explorer/observer";A.type="passkey";function A({chainId:e,bundlerTransport:t,paymasterAddress:n,explorerUrl:r}){return Xn(a=>{if(!a.transports)throw new Error("Wagmi must be configured with transports to use the passkey connector.");let i=a.chains.find(c=>c.id===e);if(!i)throw new Error(`Could not find configured chain for chain ID ${e}.`);let s=a.transports[i.id];if(!s)throw new Error(`Could not find configured transport for chain ID ${e}.`);let o=Vn({...V,chain:i,transport:s}),l=m.getState().activeCredential!=null;return{id:"passkey",type:A.type,name:"Passkey",async createPasskey(){let{id:c}=await Ye(),d=await E(o,c);this.onAccountsChanged([d.address]),this.onConnect?.({chainId:$e(e)})},async reusePasskey(){let{id:c}=await ue(),d=await E(o,c);this.onAccountsChanged([d.address]),this.onConnect?.({chainId:$e(e)})},hasPasskey(){return Object.keys(m.getState().publicKeys).length>0},async connect(c){if(console.log("connect"),c?.chainId!=null&&c.chainId!==e)throw new Error(`Can't connect to chain ${c.chainId}. Passkey connector is bound to chain ${e}.`);!m.getState().activeCredential&&!c?.isReconnecting&&await ue();let d=await this.getAccounts();return l=d.length>0,{accounts:d,chainId:e}},async disconnect(){console.log("disconnect"),l=!1,m.setState({activeCredential:null})},async getAccounts(){console.log("getAccounts");let c=m.getState().activeCredential;if(!c)return[];try{console.log("getting account for credential",c);let d=await E(o,c);return console.log("got account",d),[d.address]}catch{console.log("could not get address for credential ID",c)}return[]},async getChainId(){return e},async isAuthorized(){return console.log("isAuthorized"),l?(await this.getAccounts()).length>0:!1},async switchChain(c){if(c.chainId!==e)throw new Error(`Can't connect to chain ${c.chainId}. Passkey connector is bound to chain ${e}.`);let d=a.chains.find(p=>p.id===c.chainId);if(!d)throw new Qn(new Yn);return d},onAccountsChanged(c){console.log("onAccountsChanged"),c.length>0?a.emitter.emit("change",{accounts:c.map(d=>qn(d))}):this.onDisconnect()},onChainChanged(c){console.log("onChainChanged"),a.emitter.emit("change",{chainId:Number(c)})},async onConnect(c){console.log("onConnect");let d=await this.getAccounts();a.emitter.emit("connect",{accounts:d,chainId:e})},async onDisconnect(c){console.log("onDisconnect"),a.emitter.emit("disconnect"),l=!1},async getClient(c){console.log("passkeyConnector.getClient",c);let d=m.getState().activeCredential;if(!d)throw new Error("Not connected.");let p=await E(o,d);return _({paymasterAddress:n,transport:t,client:o,account:p}).extend($n()).extend(f=>r?jn({explorerUrl:r})(f):{})},async getProvider(c){return _n({request:o.transport.request})({retryCount:0})}}})}function je(){let t=Jn().find(n=>n.type===A.type);if(!t)throw new Error("Could not find passkey connector. Did you configure Wagmi with the EntryKit passkey connector or passkey wallet?");return t}import{twMerge as Zn}from"tailwind-merge";import{jsx as fe,jsxs as er}from"react/jsx-runtime";function v({className:e,...t}){return er("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 8 8",fill:"currentColor",shapeRendering:"crispEdges",className:Zn("-my-[0.125em] h-[1.25em] w-[1.25em]",e),...t,children:[fe("path",{d:"M0 0h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm2-1h1v1H7zm0 1h1v1H7zM6 7h1v1H6zm1-2h1v1H7zm0-1h1v1H7zm0-1h1v1H7z"}),fe("path",{d:"M2 2h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm1-3h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm0 1h1v1H5zm0 1h1v1H5zm0 1h1v1H5zM4 5h1v1H4zM3 5h1v1H3z",opacity:".5"}),fe("path",{d:"M7 2h1v1H7zm0-1h1v1H7zM1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm1 0h1v1H6zm1 0h1v1H7z"})]})}function Je(){let{appInfo:e}=u(),t=e?.name??document.title,n=location.host,r=e?.icon??document.querySelector("link[rel~='icon']")?.getAttribute("href")??"/favico.ico",a=e?.image;return{appName:t,appOrigin:n,appIcon:r,appImage:a}}import{useQuery as tr}from"@tanstack/react-query";function q(e){return tr({enabled:!!e,retry:!1,retryOnMount:!1,refetchOnMount:!1,refetchOnWindowFocus:!1,queryKey:[e],queryFn:()=>new Promise((t,n)=>{if(!e)throw new Error("usePreloadImage: Must provide `url` to preload image.");let r=new Image;r.onload=()=>t(r),r.onerror=()=>n(new Error(`usePreloadImage: Could not load image.
1430
+ `;import{useResizeObserver as Qt}from"usehooks-ts";import{mergeRefs as Yt}from"react-merge-refs";import{createContext as Lt,useContext as Bt}from"react";import{jsx as Ft}from"react/jsx-runtime";var Ie=Lt(null);function He({frame:e,children:t}){if(Bt(Ie))throw new Error("`FrameProvider` can only be used once.");return Ft(Ie.Provider,{value:{frame:e},children:t})}import{useMediaQuery as Gt}from"usehooks-ts";import"@rainbow-me/rainbowkit/styles.css";import{createContext as Wt,useContext as Re}from"react";import{RainbowKitProvider as Ut,lightTheme as Ne,midnightTheme as Ee}from"@rainbow-me/rainbowkit";import{jsx as Te}from"react/jsx-runtime";var se=Wt(null);function Oe({config:e,children:t}){if(Re(se))throw new Error("`EntryKitProvider` can only be used once.");return Te(Ut,{initialChain:e.chainId,appInfo:{appName:e.appInfo?.name},theme:e.theme==="light"?Ne({borderRadius:"none"}):e.theme==="dark"?Ee({borderRadius:"none"}):{lightMode:Ne({borderRadius:"none"}),darkMode:Ee({borderRadius:"none"})},children:Te(se.Provider,{value:e,children:t})})}function u(){let e=Re(se);if(!e)throw new Error("`useEntryKitConfig` can only be used within a `EntryKitProvider`.");return e}function De(){let{theme:e}=u(),t=Gt("(prefers-color-scheme: dark)");return e??(t?"dark":"light")}import{jsx as I,jsxs as $t}from"react/jsx-runtime";function Xt({onSize:e,...t}){let n=Ke(null);return Qt({ref:n,onResize:e}),I("div",{ref:n,...t,style:{...t.style,display:"inline-grid"}})}var K=Vt(function({mode:t,children:n},r){let a=Ke(null),[i,s]=ze(!1),o=i?a.current:null,[l,c]=ze({width:void 0,height:void 0}),d=o?.contentDocument,p=De();_t(()=>{d&&d.body.setAttribute("data-theme",p)},[d,p]);let f=t==="modal"?{all:"unset",display:"block",position:"fixed",inset:"0",width:"100%",height:"100%",zIndex:"2147483646"}:l.width&&l.height?{all:"unset",display:"inline-grid",width:`${l.width}px`,height:`${l.height}px`}:{all:"unset",display:"block",position:"fixed",inset:"0",width:"100%",height:"100%",opacity:0,pointerEvents:"none"};return I("iframe",{ref:Yt([r,a]),style:f,onLoad:()=>s(!0),srcDoc:"<!doctype html><title>\u2026</title>",children:d?qt.createPortal($t(He,{frame:o,children:[I("div",{children:t==="modal"?n:I(Xt,{onSize:c,children:n})}),I("style",{dangerouslySetInnerHTML:{__html:Me}})]}),d.body):null})});import{twMerge as Le}from"tailwind-merge";import{jsx as k,jsxs as en}from"react/jsx-runtime";function Be({open:e,onOpenChange:t,children:n}){return k(jt,{open:e,onOpenChange:t,children:k(Jt,{children:en(K,{mode:"modal",children:[k("div",{className:Le("fixed inset-0","bg-neutral-800/85","animate-in animate-duration-300 fade-in")}),k("div",{className:Le("fixed inset-0","grid items-end sm:items-center","animate-in animate-duration-300 fade-in slide-in-from-bottom-16"),children:k("div",{children:k(Zt,{className:"outline-none w-full max-w-[26rem] mx-auto","aria-describedby":void 0,onOpenAutoFocus:r=>{r.preventDefault()},children:n})})})]})})})}import{useCallback as ce,useMemo as tn}from"react";import{useStore as nn}from"zustand";import{createStore as rn}from"zustand/vanilla";var L=rn(()=>({open:!1}));function y(){let e=nn(L,a=>a.open),t=ce(()=>{L.setState({open:!0})},[]),n=ce(()=>{L.setState({open:!1})},[]),r=ce(a=>{L.setState({open:a})},[]);return tn(()=>({accountModalOpen:e,openAccountModal:t,closeAccountModal:n,toggleAccountModal:r}),[e,t,n,r])}import{twMerge as Mt}from"tailwind-merge";import{useConnectorClient as ea}from"wagmi";import{useAccount as rr}from"wagmi";import{twMerge as B}from"tailwind-merge";import{twMerge as an}from"tailwind-merge";import{jsx as Fe,jsxs as on}from"react/jsx-runtime";function x({className:e,...t}){return on("svg",{className:an("-my-[0.125em] h-[1.25em] w-[1.25em] animate-spin",e),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",...t,children:[Fe("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),Fe("path",{className:"opacity-75",fill:"currentColor",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"})]})}import{jsx as H,jsxs as cn}from"react/jsx-runtime";var sn=({variant:e="primary"}={})=>B("group self-center leading-none outline-none border-4 border-transparent","transition hover:brightness-125 active:brightness-150","focus:border-orange-500","aria-disabled:pointer-events-none aria-busy:pointer-events-none","aria-disabled:opacity-50","p-[.75em] font-medium",{primary:B("bg-neutral-700 text-white"),secondary:B("bg-neutral-800 text-white")}[e]),g=({pending:e,variant:t,type:n,className:r,children:a,disabled:i,...s})=>H("button",{type:n||"button",className:B(sn({variant:t,pending:e}),r),"aria-busy":e,"aria-disabled":i,disabled:i||e,...s,children:cn("span",{className:"grid grid-cols-[1fr_auto_1fr] gap-2",children:[H("span",{className:"flex items-center justify-end text-[.75em]",children:H("span",{className:"transition opacity-0 translate-x-2 group-aria-busy:opacity-100 group-aria-busy:translate-x-0 duration-100 group-aria-busy:duration-300",children:H(x,{})})}),H("span",{children:a})]})});import{useConnectModal as ar}from"@rainbow-me/rainbowkit";import{useMutation as et}from"@tanstack/react-query";import{useConnectors as Jn}from"wagmi";import{createClient as Vn,custom as _n,getAddress as qn,numberToHex as $e,SwitchChainError as Qn}from"viem";import{ChainNotConfiguredError as Yn,createConnector as Xn}from"wagmi";import{createStore as dn}from"zustand/vanilla";import{persist as ln}from"zustand/middleware";var m=dn(ln(()=>({publicKeys:{},addresses:{},activeCredential:null}),{name:"mud:passkey:cache"}));function pn(e){e.key===m.persist.getOptions().name&&m.persist.rehydrate()}window.addEventListener("storage",pn);import{smartAccountActions as $n}from"permissionless/clients";import{toWebAuthnAccount as Pn}from"viem/account-abstraction";import{BaseError as un}from"abitype";import{pad as mn,encodeFunctionData as de,hashMessage as fn,hashTypedData as Ue,encodeAbiParameters as Ge,stringToHex as yn,size as gn,encodePacked as hn,parseSignature as wn}from"viem";import{entryPoint07Abi as bn,entryPoint07Address as xn,getUserOperationHash as vn,toSmartAccount as Cn}from"viem/account-abstraction";import{readContract as We}from"viem/actions";import{parseSignature as kn}from"webauthn-p256";async function U(e){let{client:t,owners:n,nonce:r=0n}=e,a=e.address,i={abi:bn,address:xn,version:"0.7"},s={abi:Sn,address:"0x356336adA1619BeC1Ae4E6D94Dd9c0490DA414a8"};if(!n.length)throw new Error("`owners` must have at least one account.");function o(d){return d.type==="webAuthn"?d.publicKey:mn(d.address)}let l=e.signer??n[0],c=n.indexOf(l);if(c===-1)throw new Error("`signer` must be one of `owners`.");return Cn({client:t,entryPoint:i,extend:{__isCoinbaseSmartAccount:!0,abi:W,factory:s,signer:l},async encodeCalls(d){return d.length===1?de({abi:W,functionName:"execute",args:[d[0].to,d[0].value??0n,d[0].data??"0x"]}):de({abi:W,functionName:"executeBatch",args:[d.map(p=>({data:p.data??"0x",target:p.to,value:p.value??0n}))]})},async getAddress(){return a??=await We(t,{...s,functionName:"getAddress",args:[n.map(o),r]}),a},async getFactoryArgs(){let d=de({abi:s.abi,functionName:"createAccount",args:[n.map(o),r]});return{factory:s.address,factoryData:d}},async getStubSignature(){return l.type==="webAuthn"?"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000":N({signature:"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c",ownerIndex:c})},async sign(d){let p=await this.getAddress(),f=le({address:p,chainId:t.chain.id,hash:d.hash}),h=await F({hash:f,owner:l});return N({signature:h,ownerIndex:c})},async signMessage(d){let{message:p}=d,f=await this.getAddress(),h=le({address:f,chainId:t.chain.id,hash:fn(p)}),M=await F({hash:h,owner:l});return N({signature:M,ownerIndex:c})},async signTypedData(d){let{domain:p,types:f,primaryType:h,message:M}=d,ie=await this.getAddress(),Dt=le({address:ie,chainId:t.chain.id,hash:Ue({domain:p,message:M,primaryType:h,types:f})}),zt=await F({hash:Dt,owner:l});return N({signature:zt,ownerIndex:c})},async signUserOperation(d){let{chainId:p=t.chain.id,...f}=d,h=await this.getAddress(),M=vn({chainId:p,entryPointAddress:i.address,entryPointVersion:i.version,userOperation:{...f,sender:h}}),ie=await F({hash:M,owner:l});return N({signature:ie,ownerIndex:c})},userOperation:{async estimateGas(d){if(l.type==="webAuthn")return{verificationGasLimit:BigInt(Math.max(Number(d.verificationGasLimit??0n),8e5))}}},async isOwner(d){return await We(t,{abi:W,address:await this.getAddress(),functionName:"isOwnerBytes",args:[o(d)]})}})}async function F({hash:e,owner:t}){if(t.type==="webAuthn"){let{signature:n,webauthn:r}=await t.sign({hash:e});return An({signature:n,webauthn:r})}if(t.sign)return t.sign({hash:e});throw new un("`owner` does not support raw sign.")}function le({address:e,chainId:t,hash:n}){return Ue({domain:{chainId:t,name:"Coinbase Smart Wallet",verifyingContract:e,version:"1"},types:{CoinbaseSmartWalletMessage:[{name:"hash",type:"bytes32"}]},primaryType:"CoinbaseSmartWalletMessage",message:{hash:n}})}function An({webauthn:e,signature:t}){let{r:n,s:r}=kn(t);return Ge([{components:[{name:"authenticatorData",type:"bytes"},{name:"clientDataJSON",type:"bytes"},{name:"challengeIndex",type:"uint256"},{name:"typeIndex",type:"uint256"},{name:"r",type:"uint256"},{name:"s",type:"uint256"}],type:"tuple"}],[{authenticatorData:e.authenticatorData,clientDataJSON:yn(e.clientDataJSON),challengeIndex:BigInt(e.challengeIndex),typeIndex:BigInt(e.typeIndex),r:n,s:r}])}function N(e){let{ownerIndex:t}=e,n=(()=>{if(gn(e.signature)!==65)return e.signature;let r=wn(e.signature);return hn(["bytes32","bytes32","uint8"],[r.r,r.s,r.yParity===0?27:28])})();return Ge([{components:[{name:"ownerIndex",type:"uint8"},{name:"signatureData",type:"bytes"}],type:"tuple"}],[{ownerIndex:t,signatureData:n}])}var W=[{inputs:[],stateMutability:"nonpayable",type:"constructor"},{inputs:[{name:"owner",type:"bytes"}],name:"AlreadyOwner",type:"error"},{inputs:[],name:"Initialized",type:"error"},{inputs:[{name:"owner",type:"bytes"}],name:"InvalidEthereumAddressOwner",type:"error"},{inputs:[{name:"key",type:"uint256"}],name:"InvalidNonceKey",type:"error"},{inputs:[{name:"owner",type:"bytes"}],name:"InvalidOwnerBytesLength",type:"error"},{inputs:[],name:"LastOwner",type:"error"},{inputs:[{name:"index",type:"uint256"}],name:"NoOwnerAtIndex",type:"error"},{inputs:[{name:"ownersRemaining",type:"uint256"}],name:"NotLastOwner",type:"error"},{inputs:[{name:"selector",type:"bytes4"}],name:"SelectorNotAllowed",type:"error"},{inputs:[],name:"Unauthorized",type:"error"},{inputs:[],name:"UnauthorizedCallContext",type:"error"},{inputs:[],name:"UpgradeFailed",type:"error"},{inputs:[{name:"index",type:"uint256"},{name:"expectedOwner",type:"bytes"},{name:"actualOwner",type:"bytes"}],name:"WrongOwnerAtIndex",type:"error"},{anonymous:!1,inputs:[{indexed:!0,name:"index",type:"uint256"},{indexed:!1,name:"owner",type:"bytes"}],name:"AddOwner",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"index",type:"uint256"},{indexed:!1,name:"owner",type:"bytes"}],name:"RemoveOwner",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"implementation",type:"address"}],name:"Upgraded",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"REPLAYABLE_NONCE_KEY",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{name:"owner",type:"address"}],name:"addOwnerAddress",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"x",type:"bytes32"},{name:"y",type:"bytes32"}],name:"addOwnerPublicKey",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"functionSelector",type:"bytes4"}],name:"canSkipChainIdValidation",outputs:[{name:"",type:"bool"}],stateMutability:"pure",type:"function"},{inputs:[],name:"domainSeparator",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"eip712Domain",outputs:[{name:"fields",type:"bytes1"},{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"},{name:"salt",type:"bytes32"},{name:"extensions",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[],name:"entryPoint",outputs:[{name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{name:"target",type:"address"},{name:"value",type:"uint256"},{name:"data",type:"bytes"}],name:"execute",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{components:[{name:"target",type:"address"},{name:"value",type:"uint256"},{name:"data",type:"bytes"}],name:"calls",type:"tuple[]"}],name:"executeBatch",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{name:"calls",type:"bytes[]"}],name:"executeWithoutChainIdValidation",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{components:[{name:"sender",type:"address"},{name:"nonce",type:"uint256"},{name:"initCode",type:"bytes"},{name:"callData",type:"bytes"},{name:"callGasLimit",type:"uint256"},{name:"verificationGasLimit",type:"uint256"},{name:"preVerificationGas",type:"uint256"},{name:"maxFeePerGas",type:"uint256"},{name:"maxPriorityFeePerGas",type:"uint256"},{name:"paymasterAndData",type:"bytes"},{name:"signature",type:"bytes"}],name:"userOp",type:"tuple"}],name:"getUserOpHashWithoutChainId",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"implementation",outputs:[{name:"$",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{name:"owners",type:"bytes[]"}],name:"initialize",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{name:"account",type:"address"}],name:"isOwnerAddress",outputs:[{name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{name:"account",type:"bytes"}],name:"isOwnerBytes",outputs:[{name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{name:"x",type:"bytes32"},{name:"y",type:"bytes32"}],name:"isOwnerPublicKey",outputs:[{name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{name:"hash",type:"bytes32"},{name:"signature",type:"bytes"}],name:"isValidSignature",outputs:[{name:"result",type:"bytes4"}],stateMutability:"view",type:"function"},{inputs:[],name:"nextOwnerIndex",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{name:"index",type:"uint256"}],name:"ownerAtIndex",outputs:[{name:"",type:"bytes"}],stateMutability:"view",type:"function"},{inputs:[],name:"ownerCount",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"proxiableUUID",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{name:"index",type:"uint256"},{name:"owner",type:"bytes"}],name:"removeLastOwner",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"index",type:"uint256"},{name:"owner",type:"bytes"}],name:"removeOwnerAtIndex",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"removedOwnersCount",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{name:"hash",type:"bytes32"}],name:"replaySafeHash",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{name:"newImplementation",type:"address"},{name:"data",type:"bytes"}],name:"upgradeToAndCall",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{components:[{name:"sender",type:"address"},{name:"nonce",type:"uint256"},{name:"initCode",type:"bytes"},{name:"callData",type:"bytes"},{name:"callGasLimit",type:"uint256"},{name:"verificationGasLimit",type:"uint256"},{name:"preVerificationGas",type:"uint256"},{name:"maxFeePerGas",type:"uint256"},{name:"maxPriorityFeePerGas",type:"uint256"},{name:"paymasterAndData",type:"bytes"},{name:"signature",type:"bytes"}],name:"userOp",type:"tuple"},{name:"userOpHash",type:"bytes32"},{name:"missingAccountFunds",type:"uint256"}],name:"validateUserOp",outputs:[{name:"validationData",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}],Sn=[{inputs:[{name:"implementation_",type:"address"}],stateMutability:"payable",type:"constructor"},{inputs:[],name:"OwnerRequired",type:"error"},{inputs:[{name:"owners",type:"bytes[]"},{name:"nonce",type:"uint256"}],name:"createAccount",outputs:[{name:"account",type:"address"}],stateMutability:"payable",type:"function"},{inputs:[{name:"owners",type:"bytes[]"},{name:"nonce",type:"uint256"}],name:"getAddress",outputs:[{name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"implementation",outputs:[{name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"initCodeHash",outputs:[{name:"",type:"bytes32"}],stateMutability:"view",type:"function"}];async function E(e,t){let{publicKeys:n}=m.getState(),r=n[t];if(!r)throw new Error("No public key found for passkey credential.");let i=[Pn({credential:{id:t,publicKey:r}})];return await U({client:e,owners:i})}import{bytesToHex as Dn,hashMessage as zn}from"viem";import{sign as Kn}from"webauthn-p256";import{bytesToHex as Mn,hexToBytes as Ve}from"webauthn-p256";import{concatBytes as In,utf8ToBytes as Hn}from"@noble/curves/abstract/utils";async function G(e){let{authenticatorData:t,challengeIndex:n,clientDataJSON:r,typeIndex:a,userVerificationRequired:i}=e,s=a||r.indexOf('"type"'),o=n||r.indexOf('"challenge"'),l=Ve(t);if(l.length<37)throw new Error("Invalid authenticatorData");let c=l[32];if((c&1)!==1)throw new Error("Invalid authenticatorData");if(i&&(c&4)!==4)throw new Error("Invalid authenticatorData");if((c&8)!==8&&(c&16)===16)throw new Error("Invalid authenticatorData");let d='"type":"webauthn.get"';if(d!==r.slice(Number(s),d.length+1))throw new Error("Invalid clientDataJSON");if(!r.slice(Number(o)).match(/^"challenge":"(.*?)"/))throw new Error("Invalid clientDataJSON");let f=new Uint8Array(await crypto.subtle.digest("SHA-256",Hn(r))),h=new Uint8Array(await crypto.subtle.digest("SHA-256",In(Ve(t),f)));return Mn(h)}import{sign as En}from"webauthn-p256";import{parseSignature as Nn,serializePublicKey as _e}from"webauthn-p256";import{secp256r1 as qe}from"@noble/curves/p256";function pe(e){let{r:t,s:n}=Nn(e.signatureHex),r=new qe.Signature(t,n).addRecoveryBit(1).recoverPublicKey(e.messageHash.slice(2)),a=new qe.Signature(t,n).addRecoveryBit(0).recoverPublicKey(e.messageHash.slice(2));return[_e(r),_e(a)]}import{hashMessage as Tn}from"viem";function Rn([e,t]){return On([...pe(e),...pe(t)])}async function Qe(e){let t=Tn(e.signatureHex),{signature:n,webauthn:r,raw:a}=await En({credentialId:e.credentialId,hash:t}),i=await G(r),s=Rn([e,{signatureHex:n,messageHash:i}]);if(s)return{publicKey:s,credential:a}}function On(e){let t=new Set;for(let n of e){if(t.has(n))return n;t.add(n)}}async function ue(){let e=Dn(crypto.getRandomValues(new Uint8Array(256))),t=zn(e),{signature:n,webauthn:r,raw:a}=await Kn({hash:t}),i=await(async()=>{let s=m.getState().publicKeys[a.id];if(s)return s;let o=await G(r),l=await Qe({credentialId:a.id,messageHash:o,signatureHex:n});if(!l)throw new Error("recovery failed");if(l.credential.id!==a.id)throw new Error("wrong credential");return m.setState(c=>({publicKeys:{...c.publicKeys,[a.id]:l.publicKey}})),l.publicKey})();return console.log("recovered passkey",a.id,i),m.setState(()=>({activeCredential:a.id})),{id:a.id,publicKey:i,raw:a}}import{createCredential as Ln}from"webauthn-p256";async function Ye(){let e=await Ln({name:"MUD Account"});return console.log("created passkey",e),m.setState(t=>({activeCredential:e.id,publicKeys:{...t.publicKeys,[e.id]:e.publicKey}})),e}import{resourceToHex as Bn}from"@latticexyz/common";import{parseAbi as Fn}from"viem";import Wn from"@latticexyz/world/mud.config";var V={pollingInterval:250},T=Bn({type:"system",namespace:"",name:"unlimited"}),Xe=Wn.namespaces.world.tables,me=Fn(["function registerDelegation(address delegatee, bytes32 delegationControlId, bytes initCallData)"]);import{createBundlerClient as Un}from"viem/account-abstraction";var Gn=new Set([31337,17420,17069,690]);function _({paymasterAddress:e,...t}){let n=t.chain??t.client?.chain;return Un({...V,paymaster:{getPaymasterData:async()=>({paymaster:e,paymasterData:"0x"})},userOperation:{estimateFeesPerGas:n&&Gn.has(n.id)?async()=>({maxFeePerGas:100000n,maxPriorityFeePerGas:0n}):void 0},...t})}import{observer as jn}from"@latticexyz/explorer/observer";A.type="passkey";function A({chainId:e,bundlerTransport:t,paymasterAddress:n,explorerUrl:r}){return Xn(a=>{if(!a.transports)throw new Error("Wagmi must be configured with transports to use the passkey connector.");let i=a.chains.find(c=>c.id===e);if(!i)throw new Error(`Could not find configured chain for chain ID ${e}.`);let s=a.transports[i.id];if(!s)throw new Error(`Could not find configured transport for chain ID ${e}.`);let o=Vn({...V,chain:i,transport:s}),l=m.getState().activeCredential!=null;return{id:"passkey",type:A.type,name:"Passkey",async createPasskey(){let{id:c}=await Ye(),d=await E(o,c);this.onAccountsChanged([d.address]),this.onConnect?.({chainId:$e(e)})},async reusePasskey(){let{id:c}=await ue(),d=await E(o,c);this.onAccountsChanged([d.address]),this.onConnect?.({chainId:$e(e)})},hasPasskey(){return Object.keys(m.getState().publicKeys).length>0},async connect(c){if(console.log("connect"),c?.chainId!=null&&c.chainId!==e)throw new Error(`Can't connect to chain ${c.chainId}. Passkey connector is bound to chain ${e}.`);!m.getState().activeCredential&&!c?.isReconnecting&&await ue();let d=await this.getAccounts();return l=d.length>0,{accounts:d,chainId:e}},async disconnect(){console.log("disconnect"),l=!1,m.setState({activeCredential:null})},async getAccounts(){console.log("getAccounts");let c=m.getState().activeCredential;if(!c)return[];try{console.log("getting account for credential",c);let d=await E(o,c);return console.log("got account",d),[d.address]}catch{console.log("could not get address for credential ID",c)}return[]},async getChainId(){return e},async isAuthorized(){return console.log("isAuthorized"),l?(await this.getAccounts()).length>0:!1},async switchChain(c){if(c.chainId!==e)throw new Error(`Can't connect to chain ${c.chainId}. Passkey connector is bound to chain ${e}.`);let d=a.chains.find(p=>p.id===c.chainId);if(!d)throw new Qn(new Yn);return d},onAccountsChanged(c){console.log("onAccountsChanged"),c.length>0?a.emitter.emit("change",{accounts:c.map(d=>qn(d))}):this.onDisconnect()},onChainChanged(c){console.log("onChainChanged"),a.emitter.emit("change",{chainId:Number(c)})},async onConnect(c){console.log("onConnect");let d=await this.getAccounts();a.emitter.emit("connect",{accounts:d,chainId:e})},async onDisconnect(c){console.log("onDisconnect"),a.emitter.emit("disconnect"),l=!1},async getClient(c){console.log("passkeyConnector.getClient",c);let d=m.getState().activeCredential;if(!d)throw new Error("Not connected.");let p=await E(o,d);return _({paymasterAddress:n,transport:t,client:o,account:p}).extend($n()).extend(f=>r?jn({explorerUrl:r})(f):{})},async getProvider(c){return _n({request:o.transport.request})({retryCount:0})}}})}function je(){let t=Jn().find(n=>n.type===A.type);if(!t)throw new Error("Could not find passkey connector. Did you configure Wagmi with the EntryKit passkey connector or passkey wallet?");return t}import{twMerge as Zn}from"tailwind-merge";import{jsx as fe,jsxs as er}from"react/jsx-runtime";function v({className:e,...t}){return er("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 8 8",fill:"currentColor",shapeRendering:"crispEdges",className:Zn("-my-[0.125em] h-[1.25em] w-[1.25em]",e),...t,children:[fe("path",{d:"M0 0h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm2-1h1v1H7zm0 1h1v1H7zM6 7h1v1H6zm1-2h1v1H7zm0-1h1v1H7zm0-1h1v1H7z"}),fe("path",{d:"M2 2h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm1-3h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm0 1h1v1H5zm0 1h1v1H5zm0 1h1v1H5zM4 5h1v1H4zM3 5h1v1H3z",opacity:".5"}),fe("path",{d:"M7 2h1v1H7zm0-1h1v1H7zM1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm1 0h1v1H6zm1 0h1v1H7z"})]})}function Je(){let{appInfo:e}=u(),t=e?.name??document.title,n=location.host,r=e?.icon??document.querySelector("link[rel~='icon']")?.getAttribute("href")??"/favico.ico",a=e?.image;return{appName:t,appOrigin:n,appIcon:r,appImage:a}}import{useQuery as tr}from"@tanstack/react-query";function q(e){return tr({enabled:!!e,retry:!1,retryOnMount:!1,refetchOnMount:!1,refetchOnWindowFocus:!1,queryKey:[e],queryFn:()=>new Promise((t,n)=>{if(!e)throw new Error("usePreloadImage: Must provide `url` to preload image.");let r=new Image;r.onload=()=>t(r),r.onerror=()=>n(new Error(`usePreloadImage: Could not load image.
1435
1431
 
1436
1432
  URL: ${e}`)),r.src=e})})}import{jsx as Q,jsxs as nr}from"react/jsx-runtime";function Ze(){let{appName:e,appIcon:t}=Je(),{data:n,isLoading:r}=q(t);return nr("div",{className:"flex-grow flex flex-col items-center justify-center gap-2",children:[Q("div",{className:"w-16 h-16 m-2",children:r?null:n?Q("img",{src:t,className:"w-full h-full object-cover"}):Q(v,{className:"w-full h-full text-orange-500 dark:bg-neutral-800"})}),Q("div",{className:"text-2xl text-white text-center",children:e})]})}import{twMerge as or}from"tailwind-merge";import{jsx as R,jsxs as tt}from"react/jsx-runtime";function nt(){let e=rr(),{accountModalOpen:t}=y(),{openConnectModal:n,connectModalOpen:r}=ar(),a=je(),i=et({onError:c=>console.error(c),mutationKey:["createPasskey",a.id,t,r,e.status],mutationFn:()=>a.createPasskey()}),s=et({onError:c=>console.error(c),mutationKey:["reusePasskey",a.id,t,r,e.status],mutationFn:()=>a.reusePasskey()}),o=a.hasPasskey(),l=[R(g,{variant:o?"secondary":"primary",className:"self-auto flex justify-center",pending:i.status==="pending",onClick:()=>i.mutate(),autoFocus:!o,children:"Create account"},"create"),R(g,{variant:o?"primary":"secondary",className:"self-auto flex justify-center",pending:s.status==="pending",onClick:()=>s.mutate(),autoFocus:o,children:"Sign in"},"signin")];return o&&l.reverse(),tt("div",{className:or("flex flex-col gap-6 p-6","animate-in animate-duration-300 fade-in slide-in-from-bottom-8"),children:[R("div",{className:"p-4",children:R(Ze,{})}),tt("div",{className:"self-center flex flex-col gap-2 w-60",children:[l,R("button",{className:"text-sm self-center transition text-neutral-500 hover:text-white p-2",disabled:e.status==="connecting",onClick:n,children:"Already have a wallet?"})]})]})}import{useState as Zr}from"react";import{useMemo as Jr}from"react";import{parseEther as ir}from"viem";var Y=ir("0.01");import{useReadContract as sr}from"wagmi";import cr from"@latticexyz/store/out/IStoreRead.sol/IStoreRead.abi.json";import{decodeValueArgs as dr,getKeyTuple as lr,getSchemaTypes as pr,getValueSchema as ur}from"@latticexyz/protocol-parser/internal";function rt({table:e,key:t,...n}){return sr(e&&t&&n.query?.enabled!==!1?{...n,abi:cr,functionName:"getRecord",args:[e.tableId,lr(e,t)],query:{...n.query,select:r=>({...t,...dr(pr(ur(e)),{staticData:r[0],encodedLengths:r[1],dynamicData:r[2]})})}}:{})}import{defineStore as mr}from"@latticexyz/store";import{parseAbi as fr}from"viem";var ye=fr(["error SpenderSystem_AlreadyRegistered(address spender, address user)","error SpenderSystem_HasOwnBalance(address spender)","function registerSpender(address spender)"]),yr=mr({namespaces:{root:{namespace:"",tables:{Allowance:{schema:{user:"address",allowance:"uint256"},key:["user"]},Grantor:{schema:{grantor:"address",allowance:"uint256"},key:["grantor"]},PassHolder:{schema:{user:"address",passId:"bytes32",lastRenewed:"uint256",lastClaimed:"uint256"},key:["user","passId"]},PassConfig:{schema:{passId:"bytes32",claimAmount:"uint256",claimInterval:"uint256",validityPeriod:"uint256",grantor:"address"},key:["passId"]},Spender:{schema:{spender:"address",user:"address"},key:["spender"]},SystemConfig:{schema:{entryPoint:"address"},key:[]}}}}}),X=yr.namespaces.root.tables;function $(e){let{chainId:t,paymasterAddress:n}=u();return rt({chainId:t,address:n,...e?{table:X.Allowance,key:{user:e}}:null})}import{useClient as Ar}from"wagmi";import{useQuery as Sr}from"@tanstack/react-query";import{createStore as gr}from"zustand/vanilla";import{persist as hr}from"zustand/middleware";var O=gr(hr(()=>({appSigners:{}}),{name:"mud:entrykit",partialize:({appSigners:e})=>({appSigners:e})}));function wr(e){e.key===O.persist.getOptions().name&&O.persist.rehydrate()}window.addEventListener("storage",wr);import{generatePrivateKey as br,privateKeyToAccount as xr}from"viem/accounts";function at(e){let t=O.getState().appSigners[e]??(()=>{let n=br();return O.setState(r=>({appSigners:{...r.appSigners,[e]:n}})),n})();return xr(t)}import{smartAccountActions as vr}from"permissionless";import{callFrom as Cr}from"@latticexyz/world/internal";import{observer as kr}from"@latticexyz/explorer/observer";async function ot({worldAddress:e,userAddress:t,client:n,bundlerTransport:r,paymasterAddress:a,explorerUrl:i}){let s=at(t),o=await U({client:n,owners:[s]});return _({paymasterAddress:a,transport:r,client:n,account:o}).extend(vr()).extend(Cr({worldAddress:e,delegatorAddress:t,publicClient:n})).extend(c=>i?kr({explorerUrl:i})(c):{}).extend(()=>({userAddress:t}))}function S(e){let{chainId:t,bundlerTransport:n,paymasterAddress:r,worldAddress:a,explorerUrl:i}=u(),s=Ar({chainId:t}),o=["appAccountClient",s?.uid,e];return Sr(s&&e?{queryKey:o,queryFn:async()=>await ot({worldAddress:a,userAddress:e,client:s,bundlerTransport:n,paymasterAddress:r,explorerUrl:i}),staleTime:1/0}:{queryKey:o,enabled:!1})}import{useClient as Rr}from"wagmi";import{decodeValueArgs as Pr,getKeyTuple as Mr,getSchemaTypes as Ir,getValueSchema as Hr}from"@latticexyz/protocol-parser/internal";import{readContract as Nr}from"viem/actions";import{getAction as Er}from"viem/utils";async function j(e,{address:t,table:n,key:r,blockTag:a}){let[i,s,o]=await Er(e,Nr,"readContract")({address:t,abi:Tr,functionName:"getRecord",args:[n.tableId,Mr(n,r)],blockTag:a});return{...r,...Pr(Ir(Hr(n)),{staticData:i,encodedLengths:s,dynamicData:o})}}var Tr=[{type:"function",name:"getRecord",inputs:[{name:"tableId",type:"bytes32",internalType:"ResourceId"},{name:"keyTuple",type:"bytes32[]",internalType:"bytes32[]"}],outputs:[{name:"staticData",type:"bytes",internalType:"bytes"},{name:"encodedLengths",type:"bytes32",internalType:"EncodedLengths"},{name:"dynamicData",type:"bytes",internalType:"bytes"}],stateMutability:"view"}];import{useQuery as Or}from"@tanstack/react-query";function ge({client:e,paymasterAddress:t,userAddress:n,appAccountAddress:r}){return["spender",e?.chain.id,t,n,r]}function it(e,t){let{chainId:n,paymasterAddress:r}=u(),a=Rr({chainId:n}),i=ge({client:a,paymasterAddress:r,userAddress:e,appAccountAddress:t});return Or(a&&e&&t?{queryKey:i,queryFn:async()=>(await j(a,{address:r,table:X.Spender,key:{spender:t}})).user.toLowerCase()===e.toLowerCase()}:{queryKey:i,enabled:!1})}import{useClient as Dr}from"wagmi";import{useQuery as zr}from"@tanstack/react-query";function he({client:e,worldAddress:t,userAddress:n,appAccountAddress:r}){return["delegation",e?.chain.id,t,n,r]}function st(e,t){let{chainId:n,worldAddress:r}=u(),a=Dr({chainId:n}),i=he({client:a,worldAddress:r,userAddress:e,appAccountAddress:t});return zr(a&&e&&t?{queryKey:i,queryFn:async()=>(await j(a,{address:r,table:Xe.UserDelegationControl,key:{delegator:e,delegatee:t}})).delegationControlId===T}:{queryKey:i,enabled:!1})}import{useDisconnect as Br}from"wagmi";import{useQuery as Kr}from"@tanstack/react-query";function J(e){let t=e?.toLowerCase();return Kr({enabled:!!t,queryKey:["ens",t],initialData:{address:void 0,name:void 0,displayName:void 0,avatar:void 0},queryFn:async()=>{let n=await fetch(`https://api.ensideas.com/ens/resolve/${t}`).then(r=>r.json());return{address:n.address??void 0,name:n.name??void 0,displayName:n.displayName??void 0,avatar:n.avatar??void 0}}})}import{jsx as we,jsxs as Lr}from"react/jsx-runtime";function Z({hex:e}){return e.length<=10?we("span",{title:e,children:e}):Lr("span",{title:e,children:[we("span",{className:"after:select-none after:content-['\u2026']",children:e.slice(0,6)}),we("span",{className:"tracking-[-1ch] text-transparent",children:e.slice(6,-4)}),e.slice(-4)]})}import{jsx as D,jsxs as be}from"react/jsx-runtime";function ct({isActive:e,isExpanded:t,userAddress:n}){let{data:r}=J(n),{disconnect:a,isPending:i}=Br(),{closeAccountModal:s}=y();return be("div",{className:"flex flex-col gap-4",children:[be("div",{className:"flex justify-between gap-4",children:[be("div",{children:[D("div",{children:"Account"}),D("div",{className:"font-mono text-white",children:r.name??D(Z,{hex:n})})]}),D(g,{variant:e?"primary":"secondary",className:"flex-shrink-0 text-sm p-1 w-28",pending:i,onClick:()=>{s(),a()},children:"Sign out"})]}),t?D("p",{className:"text-sm",children:"Each of your onchain actions in this app is associated with your account."}):null]})}import{useMutation as Fr,useQueryClient as Wr}from"@tanstack/react-query";function dt(){let e=Wr(),{passIssuerTransport:t}=u();return Fr({onError:n=>console.error(n),mutationKey:["claimGasPass"],mutationFn:async n=>{let r=t({retryCount:0});await r.request({method:"quarry_issuePass",params:["0x01",n]}),await r.request({method:"quarry_claimAllowance",params:["0x01",n]}),await e.invalidateQueries({queryKey:["readContract"]})}})}import{twMerge as Ur}from"tailwind-merge";import{jsx as ee,jsxs as Gr}from"react/jsx-runtime";function lt({className:e,...t}){return Gr("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 263 428",fill:"currentColor",className:Ur("w-[0.6em] h-[1em]",e),...t,children:[ee("path",{d:"M132 321V428L263 243L132 321Z"}),ee("path",{d:"M0 243L132 321V428",fillOpacity:"0.5"}),ee("path",{d:"M132 0V296L263 218"}),ee("path",{d:"M0 218L132 296V0L0 218Z",fillOpacity:"0.5"})]})}import{formatEther as Vr}from"viem";function pt(e){let t=Vr(e),n=Math.floor(parseFloat(t)).toString().length;return parseFloat(t).toLocaleString("en-US",{maximumFractionDigits:Math.max(0,6-n)})}import{jsx as _r,jsxs as qr}from"react/jsx-runtime";function ut({wei:e}){return qr("span",{className:"inline-flex items-center gap-1",children:[pt(e)," ",_r(lt,{})]})}import{useEffect as Qr}from"react";import{jsx as P,jsxs as xe}from"react/jsx-runtime";function mt({isActive:e,isExpanded:t,userAddress:n}){let r=$(n),a=dt();return Qr(()=>{e&&a.status==="idle"&&r.data&&r.data.allowance<Y&&a.mutate(n)},[r.data,a,e,n]),xe("div",{className:"flex flex-col gap-4",children:[xe("div",{className:"flex justify-between gap-4",children:[xe("div",{children:[P("div",{children:"Allowance"}),P("div",{className:"font-mono text-white",children:r.data?P(ut,{wei:r.data.allowance}):P(x,{})})]}),P(g,{variant:e?"primary":"secondary",className:"flex-shrink-0 text-sm p-1 w-28",pending:a.status==="pending",onClick:()=>a.mutate(n),children:"Top up"})]}),t?P("p",{className:"text-sm",children:"Your allowance is used to pay for onchain computation."}):null]})}import{useMutation as Yr,useQueryClient as Xr}from"@tanstack/react-query";import{getAction as te}from"viem/utils";import{sendUserOperation as $r,waitForUserOperationReceipt as jr}from"viem/account-abstraction";import{writeContract as ft}from"viem/actions";function yt(){let{worldAddress:e,paymasterAddress:t}=u(),n=Xr();return Yr({onError:r=>console.error(r),mutationKey:["setupAppAccount"],mutationFn:async({userClient:r,appAccountAddress:a,registerSpender:i,registerDelegation:s})=>{r.account.type!=="smart"&&(await te(r,ft,"writeContract")({chain:r.chain,account:r.account,address:t,abi:ye,functionName:"registerSpender",args:[a]}),await te(r,ft,"writeContract")({chain:r.chain,account:r.account,address:e,abi:me,functionName:"registerDelegation",args:[a,T,"0x"]}));let o=[];if(i&&(console.log("registering spender"),o.push({to:t,abi:ye,functionName:"registerSpender",args:[a]})),s&&(console.log("registering delegation"),o.push({to:e,abi:me,functionName:"registerDelegation",args:[a,T,"0x"]})),!o.length)return;console.log("setting up account with",o);let l=await te(r,$r,"sendUserOperation")({calls:o});console.log("got user op hash",l);let c=await te(r,jr,"waitForUserOperationReceipt")({hash:l});if(console.log("got user op receipt",c),await n.invalidateQueries({queryKey:["readContract"]}),!!c.success){if(i){let d=ge({client:r,paymasterAddress:t,userAddress:r.account.address,appAccountAddress:a});n.setQueryData(d,!0)}if(s){let d=he({client:r,worldAddress:e,userAddress:r.account.address,appAccountAddress:a});n.setQueryData(d,!0)}}}})}import{jsx as z,jsxs as ve}from"react/jsx-runtime";function gt({isActive:e,isExpanded:t,userClient:n,registerSpender:r,registerDelegation:a}){let{closeAccountModal:i}=y(),s=S(n.account.address),o=yt(),l=!a&&!a;return ve("div",{className:"flex flex-col gap-4",children:[ve("div",{className:"flex justify-between gap-4",children:[ve("div",{children:[z("div",{children:"Session"}),z("div",{className:"font-mono text-white",children:l?"Enabled":"Set up"})]}),l?z(g,{variant:e?"primary":"secondary",className:"flex-shrink-0 text-sm p-1 w-28",disabled:!0,children:"Disable"}):z(g,{variant:e?"primary":"secondary",className:"flex-shrink-0 text-sm p-1 w-28",pending:!s.data||o.status==="pending",onClick:s.data?async()=>{await o.mutateAsync({userClient:n,appAccountAddress:s.data.account.address,registerSpender:r,registerDelegation:a}),i()}:void 0,children:"Enable"})]}),t?z("p",{className:"text-sm",children:"You can perform actions in this app without interruptions for approvals."}):null]})}import{jsx as Ce}from"react/jsx-runtime";function ne(e){let t=e?.account.address,n=$(t),r=S(t),i=it(t,r.data?.account.address).data===!0,o=st(t,r.data?.account.address).data===!0;return Jr(()=>t?[{id:"wallet",label:"Sign in",isComplete:!0,content:l=>Ce(ct,{...l,userAddress:t})},{id:"allowance",label:"Top up",isComplete:(n.data?.allowance??0n)>=Y,content:l=>Ce(mt,{...l,userAddress:t})},{id:"session",label:"Set up account",isComplete:i&&o,content:l=>Ce(gt,{...l,userClient:e,registerSpender:!i,registerDelegation:!o})}]:[{id:"wallet",label:"Sign in",isComplete:!1,content:()=>null}],[n.data?.allowance,o,i,t,e])}import{twMerge as ke}from"tailwind-merge";import{jsx as Ae}from"react/jsx-runtime";function ht({userClient:e}){let t=ne(e),[n]=Zr(null),r=t.find(o=>o.content!=null&&!o.isComplete),a=t.filter(o=>o.isComplete),i=(n!=null?t.find(o=>o.id===n):null)??r??(a.length<t.length?a.at(-1):null),s=i?t.indexOf(i):-1;return Ae("div",{className:ke("min-h-[26rem] px-8 flex flex-col divide-y divide-neutral-800","animate-in animate-duration-300 fade-in slide-in-from-bottom-8"),children:t.map((o,l)=>{let c=o===i,d=c||a.length===t.length,p=!o.isComplete&&s!==-1&&l>s;return Ae("div",{className:ke("py-8 flex flex-col justify-center",c?"flex-grow":null),children:Ae("div",{className:ke("flex flex-col",p?"opacity-30 pointer-events-none":null),children:o.content({isActive:c,isExpanded:d})})},o.id)})})}import{jsx as wt}from"react/jsx-runtime";function bt(){let{chainId:e}=u(),t=ea({chainId:e});return t.status!=="success"?wt(nt,{}):wt(ht,{userClient:t.data})}import{useState as oa}from"react";import{ErrorBoundary as ia}from"react-error-boundary";import{twMerge as ta}from"tailwind-merge";import{BaseError as na,UserRejectedRequestError as ra}from"viem";import{jsx as xt,jsxs as aa}from"react/jsx-runtime";function vt({title:e,error:t}){if(!t||t instanceof na&&t.walk(a=>a instanceof ra)!=null)return null;let n=e??"Error",r=typeof t=="string"?t:t instanceof Error?String(t):"Something unexpected happened.";return aa("div",{className:ta("text-sm border-l-4 border-red-500","bg-red-100 text-red-900","dark:bg-red-900 dark:text-red-50"),children:[xt("div",{className:"p-3 font-semibold",children:n}),xt("div",{className:"px-3 whitespace-break-spaces break-all max-h-32 overflow-y-scroll",children:r})]})}import{wait as sa}from"@latticexyz/common/utils";import{twMerge as ca}from"tailwind-merge";import{useIsMounted as da}from"usehooks-ts";import{jsx as re,jsxs as Ct}from"react/jsx-runtime";function kt({children:e}){let t=da(),[n,r]=oa(1);return re(ia,{fallbackRender:({error:a,resetErrorBoundary:i})=>Ct("div",{className:ca("flex-grow flex flex-col justify-center p-5 gap-2"),children:[re(vt,{error:a instanceof Error?a.stack??a.message:a}),n>0?Ct("button",{type:"button",onClick:async s=>{s.currentTarget.ariaBusy="true",await sa(1e3),i(),t()&&(r(o=>o-1),s.currentTarget.ariaBusy=null)},className:"group aria-busy:pointer-events-none self-end flex items-center gap-1",children:[re(x,{className:"transition opacity-0 group-aria-busy:opacity-100 text-xs text-neutral-500 dark:text-neutral-400"}),re("span",{className:"text-sm text-neutral-500 dark:text-neutral-400 group-hover:text-black dark:group-hover:text-white",children:"Retry?"})]}):null]}),children:e})}import{DialogClose as ua,DialogTitle as ma}from"@radix-ui/react-dialog";import{twMerge as la}from"tailwind-merge";import{jsx as pa}from"react/jsx-runtime";function At({className:e,children:t,...n}){return pa("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",className:la("-my-[0.125em] h-[1.25em] w-[1.25em]",e),...n,children:t})}import{jsx as St}from"react/jsx-runtime";function Pt(e){return St(At,{strokeWidth:"2",stroke:"currentColor",...e,children:St("path",{d:"M6 18L18 6M6 6L18 18",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}import{jsx as w,jsxs as Se}from"react/jsx-runtime";function It(){let{accountModalOpen:e,toggleAccountModal:t}=y();return Se(Be,{open:e,onOpenChange:t,children:[w(ma,{className:"sr-only",children:"Connect with EntryKit"}),e?Se("div",{className:Mt("relative py-2 ring-1","bg-neutral-900 text-neutral-400 ring-neutral-700/50 divide-neutral-700","links:font-medium links:underline links:underline-offset-4","links:text-white","links:decoration-neutral-500 hover:links:decoration-orange-500"),children:[w(kt,{children:w(bt,{})}),Se("a",{href:"https://mud.dev",target:"_blank",rel:"noreferrer noopener",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",children:[w("span",{className:"block w-4 h-4",children:w(v,{className:"w-full h-full text-orange-500 group-hover:rotate-90 transition duration-300"})}),w("span",{children:"Powered by MUD"})]}),w("div",{className:"absolute top-0 right-0",children:w(ua,{className:Mt("pointer-events-auto leading-none p-2 transition","text-neutral-700 hover:text-neutral-500"),title:"Close",children:w(Pt,{className:"m-0"})})})]}):null]})}import{jsx as ya,jsxs as ga}from"react/jsx-runtime";function fa({config:e,children:t}){return ga(Oe,{config:e,children:[t,ya(It,{})]})}import{useAccount as xa}from"wagmi";import{twMerge as C}from"tailwind-merge";import{twMerge as Ht}from"tailwind-merge";import{Fragment as ha,jsx as ae,jsxs as Nt}from"react/jsx-runtime";function Et({address:e}){let{data:t}=J(e),{isSuccess:n}=q(t.avatar);return Nt(ha,{children:[Nt("span",{className:"flex-shrink-0 w-6 h-6 -my-1 -mx-0.5 grid place-items-center",children:[ae("img",{src:n?t.avatar:void 0,className:Ht("col-start-1 row-start-1","inline-flex w-full h-full rounded-full bg-black/10 dark:bg-white/10 bg-cover bg-no-repeat bg-center",n?"opacity-100":"opacity-0")}),ae(v,{className:Ht("col-start-1 row-start-1 text-orange-500","transition duration-300",n?"opacity-0":"opacity-100")})]}),ae("span",{className:"flex-grow",children:t.name??(e?ae(Z,{hex:e}):null)})]})}import{useMemo as wa}from"react";import{useConnectorClient as ba}from"wagmi";function Pe(){let{chainId:e}=u(),{data:t,error:n}=ba({chainId:e});n&&console.error("Error retrieving user client",n);let r=S(t?.account.address),a=ne(t);return wa(()=>{if(a.every(i=>i.isComplete))return r.data},[r.data,a])}import{jsx as b,jsxs as Rt}from"react/jsx-runtime";var Tt=C("w-48 inline-flex outline-none transition","border border-transparent","text-base leading-none"),va=C("bg-neutral-100 border-neutral-300 text-black","dark:bg-neutral-800 dark:border-neutral-700 dark:text-white"),Ca=C("cursor-pointer outline-none hover:bg-neutral-200 data-[highlighted]:bg-neutral-200 dark:hover:bg-neutral-700");function ka(){let{openAccountModal:e,accountModalOpen:t}=y(),{status:n,address:r}=xa();return Pe(),b(K,{mode:"child",children:n==="connected"||n==="reconnecting"&&r?b("button",{type:"button",className:C(Tt,va,Ca,"p-3"),onClick:e,children:b("span",{className:"flex-grow inline-flex gap-2.5 items-center text-left font-medium",children:b(Et,{address:r})})},"connected"):Rt("button",{type:"button",className:C(Tt,"group","items-center justify-center gap-2.5 p-3","bg-orange-500 text-white font-medium","hover:bg-orange-400","active:bg-orange-600"),"aria-busy":t,onClick:e,children:[Rt("span",{className:"pointer-events-none inline-grid place-items-center -ml-3",children:[b("span",{className:C("col-start-1 row-start-1 leading-none","scale-100 opacity-100 transition duration-300","group-aria-busy:scale-125 group-aria-busy:opacity-0"),children:b(v,{})}),b("span",{"aria-hidden":!0,className:C("col-start-1 row-start-1","scale-50 opacity-0 transition duration-300 delay-50","group-aria-busy:scale-100 group-aria-busy:opacity-100"),children:b(x,{})})]}),b("span",{className:"font-medium",children:"Sign in"})]},"sign in")})}import{connectorsForWallets as Sa,getDefaultWallets as Pa}from"@rainbow-me/rainbowkit";import{createConfig as Ma}from"wagmi";var Aa=`data:image/svg+xml;base64,${btoa('<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" width="512" height="512" viewBox="-64 -32 608 512"><path d="M6.206 425.469A6.202 6.202 0 010 419.263c0-1.771.235-3.517.663-5.245 9.95-78.847 57.22-96.006 100.964-107.256 21.008-5.412 62.901-26.489 57.822-53.668-10.596-9.819-21.113-23.39-22.946-43.63l-1.274.026c-2.932-.044-5.778-.716-8.422-2.217-5.848-3.325-9.051-9.697-10.596-16.958-3.238-22.186-4.058-33.515 7.768-38.464l.096-.035c-1.467-27.37 3.159-67.64-24.944-76.141C154.622 7.1 218.597-30.203 266.627 30.805c53.519 2.801 77.389 78.611 44.154 121.046h-1.405c11.826 4.949 10.045 17.674 7.767 38.464-1.544 7.261-4.747 13.633-10.595 16.958-2.645 1.501-5.481 2.173-8.422 2.217l-1.275-.026c-1.833 20.24-12.376 33.811-22.972 43.63-4.459 23.871 27.275 43.011 49.33 50.997a139.442 139.442 0 004.268 5.525c-7.2 9.941-8.771 22.797-4.564 34.038-17.002 8.763-24.255 29.334-16.479 46.86-11.966 7.55-18.258 21.305-16.609 34.955H6.206zm419.058-105.362a86.778 86.778 0 0019.446-1.641c29.36-5.822 53.152-27.467 62.657-55.823 3.596-10.544 5.071-21.663 4.521-33.341-1.179-23.46-12.193-46.633-29.631-62.369-17.107-15.361-38.342-23.574-61.383-23.042-22.841.507-45.359 11.216-60.187 28.593-14.977 17.551-22.003 39.144-20.921 62.133.585 11.661 3.482 23.016 8.737 34.074 7.741 16.303 19.934 29.735 35.391 39.048l-22.457 20.711 13.232 27.86-29.413 13.973 13.991 29.456-26.769 12.717 16.81 35.374 35.601-16.915 40.375-110.808zm15.239-129.364c13.685 4.869 20.824 19.908 15.954 33.593-4.87 13.685-19.908 20.833-33.593 15.963-13.685-4.87-20.834-19.917-15.963-33.602 4.87-13.685 19.917-20.825 33.602-15.954z"/></svg>')}`,oe=e=>()=>({id:"passkey",name:"Passkey",iconUrl:Aa,iconBackground:"#fec",createConnector:t=>n=>({...A(e)(n),...t})});function Ia(e){let{wallets:t}=Pa(),n=[{groupName:"Recommended",wallets:[oe({chainId:e.chainId,bundlerTransport:e.bundlerTransport,paymasterAddress:e.paymasterAddress})]},...t],r=Sa(n,{appName:e.appInfo.name,projectId:e.walletConnectProjectId});return Ma({connectors:r,chains:e.chains,transports:e.transports})}function Xl(e){return e!=null&&"__isCoinbaseSmartAccount"in e&&e.__isCoinbaseSmartAccount===!0}var jl=new Set([17420,31337]);function Jl(e){return t=>{let{request:n,...r}=e(t),a=null,i=new Map;return{...r,async request(s){if(s.method==="eth_chainId")return a??(a=await n(s));if(s.method==="eth_getTransactionReceipt"){let o=s.params[0],l=i.get(o)??await n(s);return i.has(o)||i.set(o,l),l}if(s.method==="eth_sendUserOperation"){let o=await n({...s,method:"wiresaw_sendUserOperation"});return i.set(o.userOpHash,{success:!0,userOpHash:o.userOpHash,receipt:{transactionHash:o.txHash}}),o.userOpHash}if(s.method==="eth_getUserOperationReceipt"){let o=s.params[0],l=i.get(o)??await n(s);return i.has(o)||i.set(o,l),l}return n(s)}}}}import{connectorsForWallets as Na}from"@rainbow-me/rainbowkit";import{getDefaultWallets as Ha}from"@rainbow-me/rainbowkit";function Ot(e){let{wallets:t}=Ha();return[{groupName:"Recommended",wallets:[oe({chainId:e.chainId,bundlerTransport:e.bundlerTransport,paymasterAddress:e.paymasterAddress})]},...t]}function sp({wallets:e,...t}){return Na(e??Ot(t),{appName:t.appInfo?.name??document.title,projectId:t.walletConnectProjectId})}export{ka as AccountButton,fa as EntryKitProvider,W as abi,Ia as createWagmiConfig,sp as getConnectors,Ot as getWallets,Xl as isCoinbaseSmartAccount,A as passkeyConnector,oe as passkeyWallet,F as sign,U as toCoinbaseSmartAccount,le as toReplaySafeHash,An as toWebAuthnSignature,y as useAccountModal,Pe as useAppAccountClient,u as useEntryKitConfig,Jl as wiresaw,jl as wiresawChainIds,N as wrapSignature};
1437
1433
  //# sourceMappingURL=internal.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/Modal.tsx","../../src/ui/Shadow.tsx","../../src/ui/FrameProvider.tsx","../../src/useTheme.ts","../../src/EntryKitConfigProvider.tsx","../../src/useAccountModal.ts","../../src/AccountModal.tsx","../../src/AccountModalContent.tsx","../../src/ConnectWallet.tsx","../../src/ui/Button.tsx","../../src/icons/PendingIcon.tsx","../../src/usePasskeyConnector.ts","../../src/passkey/passkeyConnector.ts","../../src/passkey/cache.ts","../../src/passkey/getAccount.ts","../../src/smart-account/toCoinbaseSmartAccount.ts","../../src/passkey/reusePasskey.ts","../../src/passkey/getMessageHash.ts","../../src/passkey/recoverPasskeyPublicKey.ts","../../src/passkey/getCandidatePublicKeys.ts","../../src/passkey/createPasskey.ts","../../src/common.ts","../../src/createBundlerClient.ts","../../src/icons/Logo.tsx","../../src/useAppInfo.ts","../../src/usePreloadImage.tsx","../../src/AppInfo.tsx","../../src/onboarding/ConnectedSteps.tsx","../../src/onboarding/useSteps.tsx","../../src/onboarding/common.ts","../../src/useRecord.ts","../../src/paymaster.ts","../../src/onboarding/useAllowance.ts","../../src/useAppAccountClient.ts","../../src/onboarding/store.ts","../../src/getAppSigner.ts","../../src/getAppAccountClient.ts","../../src/onboarding/useSpender.ts","../../src/utils/getRecord.ts","../../src/onboarding/useDelegation.ts","../../src/onboarding/Wallet.tsx","../../src/useENS.ts","../../src/ui/TruncatedHex.tsx","../../src/onboarding/useClaimGasPass.ts","../../src/icons/EthIcon.tsx","../../src/formatBalance.ts","../../src/ui/Balance.tsx","../../src/onboarding/Allowance.tsx","../../src/onboarding/useSetupAppAccount.ts","../../src/onboarding/Session.tsx","../../src/AccountModalErrorBoundary.tsx","../../src/ErrorNotice.tsx","../../src/icons/IconSVG.tsx","../../src/icons/CloseIcon.tsx","../../src/EntryKitProvider.tsx","../../src/AccountButton.tsx","../../src/AccountName.tsx","../../src/usePreparedAppAccountClient.ts","../../src/createWagmiConfig.ts","../../src/passkey/passkeyWallet.ts","../../src/smart-account/isCoinbaseSmartAccount.ts","../../src/wiresaw.ts","../../src/getConnectors.ts","../../src/getWallets.ts"],"sourcesContent":["import { ReactNode } from \"react\";\nimport { Root as DialogRoot, DialogPortal, DialogContent } from \"@radix-ui/react-dialog\";\nimport { Shadow } from \"./Shadow\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n};\n\nexport function Modal({ open, onOpenChange, children }: Props) {\n return (\n <DialogRoot open={open} onOpenChange={onOpenChange}>\n {/* This intentionally does not use `<DialogTrigger>` because it doesn't play nicely with `<Shadow>` trigger (our primary use case). */}\n <DialogPortal>\n <Shadow mode=\"modal\">\n {/**\n * This intentionally does not use `<DialogOverlay>` due to an issue it causes with scrolling the modal contents.\n * See https://github.com/radix-ui/primitives/issues/1159#issuecomment-1105320294\n */}\n <div className={twMerge(\"fixed inset-0\", \"bg-neutral-800/85\", \"animate-in animate-duration-300 fade-in\")} />\n <div\n className={twMerge(\n \"fixed inset-0\",\n \"grid items-end sm:items-center\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-16\",\n )}\n >\n <div>\n <DialogContent\n className=\"outline-none w-full max-w-[26rem] mx-auto\"\n // TODO description\n aria-describedby={undefined}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n {children}\n </DialogContent>\n </div>\n </div>\n </Shadow>\n </DialogPortal>\n </DialogRoot>\n );\n}\n","import { CSSProperties, HTMLProps, ReactNode, forwardRef, useEffect, useRef, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport css from \"tailwindcss/tailwind.css?inline\";\nimport { useResizeObserver } from \"usehooks-ts\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { FrameProvider } from \"./FrameProvider\";\nimport { useTheme } from \"../useTheme\";\n\nexport type Props = {\n mode: \"modal\" | \"child\";\n children: ReactNode;\n};\n\nfunction Resizer({\n onSize,\n ...props\n}: {\n onSize: (size: { width: number | undefined; height: number | undefined }) => void;\n} & HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement | null>(null);\n useResizeObserver({ ref, onResize: onSize });\n return <div ref={ref} {...props} style={{ ...props.style, display: \"inline-block\" }} />;\n}\n\n// TODO: make a container inside the iframe that is at least the size of the window, render content into that so we can correctly measure size relative to window\n// otherwise as the iframe shrinks, the measurement will be based on that shrunk value and it'll never get bigger, only smaller\n\nexport const Shadow = forwardRef<HTMLIFrameElement, Props>(function Shadow({ mode, children }, forwardedRef) {\n const frameRef = useRef<HTMLIFrameElement | null>(null);\n const [loaded, setLoaded] = useState(false);\n const frame = loaded ? frameRef.current : null;\n\n const [frameSize, setFrameSize] = useState<{ width: number | undefined; height: number | undefined }>({\n width: undefined,\n height: undefined,\n });\n\n const frameDocument = frame?.contentDocument;\n const theme = useTheme();\n useEffect(() => {\n if (frameDocument) {\n frameDocument.body.setAttribute(\"data-theme\", theme);\n }\n }, [frameDocument, theme]);\n\n const frameStyle: CSSProperties =\n mode === \"modal\"\n ? {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n zIndex: \"2147483646\",\n }\n : frameSize.width && frameSize.height\n ? {\n all: \"unset\",\n display: \"inline-block\",\n width: `${frameSize.width}px`,\n height: `${frameSize.height}px`,\n }\n : {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n opacity: 0,\n pointerEvents: \"none\",\n };\n\n return (\n <iframe\n ref={mergeRefs([forwardedRef, frameRef])}\n style={frameStyle}\n onLoad={() => setLoaded(true)}\n srcDoc=\"<!doctype html><title>…</title>\"\n >\n {frameDocument\n ? ReactDOM.createPortal(\n <FrameProvider frame={frame}>\n {/*\n * TODO: make this the size of the outer window so that any container-based resizing in iframe\n * is done from that rather than the potentially-small size of this iframe\n */}\n <div>{mode === \"modal\" ? children : <Resizer onSize={setFrameSize}>{children}</Resizer>}</div>\n <style dangerouslySetInnerHTML={{ __html: css }} />\n </FrameProvider>,\n frameDocument.body,\n )\n : null}\n </iframe>\n );\n});\n","import { createContext, useContext, type ReactNode } from \"react\";\n\ntype ContextValue = {\n readonly frame: HTMLIFrameElement;\n};\n\n/** @internal */\nconst Context = createContext<ContextValue | null>(null);\n\nexport type Props = {\n frame: HTMLIFrameElement;\n children?: ReactNode;\n};\n\nexport function FrameProvider({ frame, children }: Props) {\n const value = useContext(Context);\n if (value) throw new Error(\"`FrameProvider` can only be used once.\");\n return <Context.Provider value={{ frame }}>{children}</Context.Provider>;\n}\n\nexport function useFrame(): ContextValue {\n const value = useContext(Context);\n if (!value) throw new Error(\"`useFrame` can only be used within a `FrameProvider`.\");\n return value;\n}\n","import { useMediaQuery } from \"usehooks-ts\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useTheme() {\n const { theme: initialTheme } = useEntryKitConfig();\n const darkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\n const theme = initialTheme ?? (darkMode ? \"dark\" : \"light\");\n return theme;\n}\n","import \"@rainbow-me/rainbowkit/styles.css\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { RainbowKitProvider, lightTheme, midnightTheme } from \"@rainbow-me/rainbowkit\";\nimport { EntryKitConfig } from \"./config\";\n\n/** @internal */\nconst Context = createContext<EntryKitConfig | null>(null);\n\nexport type Props = {\n config: EntryKitConfig;\n children?: ReactNode;\n};\n\nexport function EntryKitConfigProvider({ config, children }: Props) {\n const currentConfig = useContext(Context);\n if (currentConfig) throw new Error(\"`EntryKitProvider` can only be used once.\");\n\n return (\n <RainbowKitProvider\n initialChain={config.chainId}\n appInfo={{\n appName: config.appInfo?.name,\n // TODO: learn more and disclaimer\n }}\n theme={\n config.theme === \"light\"\n ? lightTheme({ borderRadius: \"none\" })\n : config.theme === \"dark\"\n ? midnightTheme({ borderRadius: \"none\" })\n : {\n lightMode: lightTheme({ borderRadius: \"none\" }),\n darkMode: midnightTheme({ borderRadius: \"none\" }),\n }\n }\n >\n <Context.Provider value={config}>{children}</Context.Provider>\n </RainbowKitProvider>\n );\n}\n\nexport function useEntryKitConfig(): EntryKitConfig {\n const config = useContext(Context);\n if (!config) throw new Error(\"`useEntryKitConfig` can only be used within a `EntryKitProvider`.\");\n return config;\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useStore } from \"zustand\";\nimport { createStore } from \"zustand/vanilla\";\n\nconst store = createStore(() => ({ open: false }));\n\nexport type UseAccountModalResult = {\n readonly accountModalOpen: boolean;\n readonly openAccountModal: () => void;\n readonly closeAccountModal: () => void;\n readonly toggleAccountModal: (open: boolean) => void;\n};\n\nexport function useAccountModal(): UseAccountModalResult {\n const accountModalOpen = useStore(store, (state) => state.open);\n\n const openAccountModal = useCallback(() => {\n store.setState({ open: true });\n }, []);\n\n const closeAccountModal = useCallback(() => {\n store.setState({ open: false });\n }, []);\n\n const toggleAccountModal = useCallback((open: boolean) => {\n store.setState({ open: open });\n }, []);\n\n return useMemo(\n () => ({\n accountModalOpen,\n openAccountModal,\n closeAccountModal,\n toggleAccountModal,\n }),\n [accountModalOpen, openAccountModal, closeAccountModal, toggleAccountModal],\n );\n}\n","import { Modal } from \"./ui/Modal\";\nimport { useAccountModal } from \"./useAccountModal\";\nimport { twMerge } from \"tailwind-merge\";\nimport { AccountModalContent } from \"./AccountModalContent\";\nimport { AccountModalErrorBoundary } from \"./AccountModalErrorBoundary\";\nimport { DialogClose, DialogTitle } from \"@radix-ui/react-dialog\";\nimport { CloseIcon } from \"./icons/CloseIcon\";\nimport { Logo } from \"./icons/Logo\";\n\nexport function AccountModal() {\n const { accountModalOpen, toggleAccountModal } = useAccountModal();\n return (\n <Modal open={accountModalOpen} onOpenChange={toggleAccountModal}>\n {/* TODO: move this into `<Modal>` props? */}\n <DialogTitle className=\"sr-only\">Connect with EntryKit</DialogTitle>\n {accountModalOpen ? (\n <div\n className={twMerge(\n \"relative py-2 ring-1\",\n \"bg-neutral-900 text-neutral-400 ring-neutral-700/50 divide-neutral-700\",\n \"links:font-medium links:underline links:underline-offset-4\",\n \"links:text-white\",\n \"links:decoration-neutral-500 hover:links:decoration-orange-500\",\n )}\n >\n <AccountModalErrorBoundary>\n <AccountModalContent />\n </AccountModalErrorBoundary>\n\n <a\n href=\"https://mud.dev\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"group self-center p-3 flex items-center justify-center gap-2 links-unset text-sm font-mono transition text-neutral-400 hover:text-white\"\n >\n <span className=\"block w-4 h-4\">\n <Logo className=\"w-full h-full text-orange-500 group-hover:rotate-90 transition duration-300\" />\n </span>\n <span>Powered by MUD</span>\n </a>\n\n <div className=\"absolute top-0 right-0\">\n <DialogClose\n className={twMerge(\n \"pointer-events-auto leading-none p-2 transition\",\n \"text-neutral-700 hover:text-neutral-500\",\n )}\n title=\"Close\"\n >\n <CloseIcon className=\"m-0\" />\n </DialogClose>\n </div>\n </div>\n ) : null}\n </Modal>\n );\n}\n","import { useConnectorClient } from \"wagmi\";\nimport { ConnectWallet } from \"./ConnectWallet\";\nimport { ConnectedSteps } from \"./onboarding/ConnectedSteps\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function AccountModalContent() {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n\n return <ConnectedSteps userClient={userClient.data} />;\n}\n","import { useAccount } from \"wagmi\";\nimport { Button } from \"./ui/Button\";\nimport { useAccountModal } from \"./useAccountModal\";\nimport { useConnectModal } from \"@rainbow-me/rainbowkit\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { usePasskeyConnector } from \"./usePasskeyConnector\";\nimport { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function ConnectWallet() {\n const userAccount = useAccount();\n const { accountModalOpen } = useAccountModal();\n const { openConnectModal, connectModalOpen } = useConnectModal();\n\n // TODO: show error states\n\n const passkeyConnector = usePasskeyConnector();\n const createPasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"createPasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.createPasskey(),\n });\n const reusePasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"reusePasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.reusePasskey(),\n });\n\n const hasPasskey = passkeyConnector.hasPasskey();\n\n const buttons = [\n <Button\n key=\"create\"\n variant={hasPasskey ? \"secondary\" : \"primary\"}\n className=\"self-auto flex justify-center\"\n pending={createPasskey.status === \"pending\"}\n onClick={() => createPasskey.mutate()}\n autoFocus={!hasPasskey}\n >\n Create account\n </Button>,\n <Button\n key=\"signin\"\n variant={hasPasskey ? \"primary\" : \"secondary\"}\n className=\"self-auto flex justify-center\"\n pending={reusePasskey.status === \"pending\"}\n onClick={() => reusePasskey.mutate()}\n autoFocus={hasPasskey}\n >\n Sign in\n </Button>,\n ];\n\n if (hasPasskey) {\n buttons.reverse();\n }\n\n return (\n <div\n className={twMerge(\"flex flex-col gap-6 p-6\", \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\")}\n >\n <div className=\"p-4\">\n {/* TODO: render appImage if available? */}\n <AppInfo />\n </div>\n <div className=\"self-center flex flex-col gap-2 w-60\">\n {buttons}\n <button\n className=\"text-sm self-center transition text-neutral-500 hover:text-white p-2\"\n disabled={userAccount.status === \"connecting\"}\n // TODO: figure out how to prevent this from switching chains after connecting\n onClick={openConnectModal}\n >\n Already have a wallet?\n </button>\n </div>\n </div>\n );\n}\n","/* eslint-disable max-len */\nimport { ButtonHTMLAttributes, DetailedHTMLProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\n\n// TODO: add support for async onClick, where pending is enabled automatically\n// TODO: add error state with popover/tooltip\n\ntype ButtonClassNameOptions = {\n variant?: \"primary\" | \"secondary\";\n pending?: boolean;\n};\n\nconst buttonClassName = ({ variant = \"primary\" }: ButtonClassNameOptions = {}) =>\n twMerge(\n \"group 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-neutral-700 text-white\"),\n secondary: twMerge(\"bg-neutral-800 text-white\"),\n }[variant],\n );\n\nexport type ButtonProps = {\n pending?: boolean;\n variant?: ButtonClassNameOptions[\"variant\"];\n};\n\nexport type Props = ButtonProps & DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;\n\nexport const Button = ({ pending, variant, type, className, children, disabled, ...props }: Props) => {\n return (\n <button\n type={type || \"button\"}\n className={twMerge(buttonClassName({ variant, pending }), className)}\n aria-busy={pending}\n aria-disabled={disabled}\n disabled={disabled || pending}\n {...props}\n >\n <span className=\"grid grid-cols-[1fr_auto_1fr] gap-2\">\n <span className=\"flex items-center justify-end text-[.75em]\">\n <span className=\"transition opacity-0 translate-x-2 group-aria-busy:opacity-100 group-aria-busy:translate-x-0 duration-100 group-aria-busy:duration-300\">\n <PendingIcon />\n </span>\n </span>\n <span>{children}</span>\n </span>\n </button>\n );\n};\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function PendingIcon({ className, ...props }: Props) {\n return (\n <svg\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em] animate-spin\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n","import { useConnectors } from \"wagmi\";\nimport { PasskeyConnector, passkeyConnector } from \"./passkey/passkeyConnector\";\n\nexport function usePasskeyConnector(): PasskeyConnector {\n const connectors = useConnectors();\n const connector = connectors.find((c) => c.type === passkeyConnector.type);\n if (!connector) {\n // TODO: provide link to instructions\n throw new Error(\n \"Could not find passkey connector. Did you configure Wagmi with the EntryKit passkey connector or passkey wallet?\",\n );\n }\n return connector as never;\n}\n","import {\n createClient,\n custom,\n EIP1193RequestFn,\n EIP1474Methods,\n getAddress,\n numberToHex,\n SwitchChainError,\n Client,\n ProviderConnectInfo,\n Transport,\n Address,\n} from \"viem\";\nimport { ChainNotConfiguredError, createConnector, CreateConnectorFn } from \"wagmi\";\nimport { cache } from \"./cache\";\nimport { smartAccountActions } from \"permissionless/clients\";\nimport { getAccount } from \"./getAccount\";\nimport { reusePasskey } from \"./reusePasskey\";\nimport { createPasskey } from \"./createPasskey\";\nimport { defaultClientConfig } from \"../common\";\nimport { createBundlerClient } from \"../createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\n\nexport type PasskeyConnectorOptions = {\n // TODO: figure out what we wanna do across chains\n chainId: number;\n bundlerTransport: Transport;\n paymasterAddress: Address;\n explorerUrl?: string;\n};\n\nexport type PasskeyProvider = {\n request: EIP1193RequestFn<EIP1474Methods>;\n};\nexport type PasskeyConnectorProperties = {\n createPasskey(): Promise<void>;\n reusePasskey(): Promise<void>;\n // TODO: does wagmi storage require this to be async?\n hasPasskey(): boolean;\n getClient(parameters?: { chainId?: number | undefined } | undefined): Promise<Client>;\n onConnect(connectInfo: ProviderConnectInfo): void;\n};\n\nexport type CreatePasskeyConnector = CreateConnectorFn<PasskeyProvider, PasskeyConnectorProperties, {}>;\nexport type PasskeyConnector = ReturnType<CreatePasskeyConnector>;\n\npasskeyConnector.type = \"passkey\" as const;\n\nexport function passkeyConnector({\n chainId,\n bundlerTransport,\n paymasterAddress,\n explorerUrl,\n}: PasskeyConnectorOptions): CreatePasskeyConnector {\n return createConnector((config) => {\n // TODO: figure out how to use with config's `client` option\n if (!config.transports) {\n throw new Error(`Wagmi must be configured with transports to use the passkey connector.`);\n }\n\n const chain = config.chains.find((c) => c.id === chainId);\n if (!chain) throw new Error(`Could not find configured chain for chain ID ${chainId}.`);\n\n const transport = config.transports[chain.id];\n if (!transport) {\n throw new Error(`Could not find configured transport for chain ID ${chainId}.`);\n }\n const client = createClient({ ...defaultClientConfig, chain, transport });\n\n let connected = cache.getState().activeCredential != null;\n\n return {\n id: \"passkey\",\n type: passkeyConnector.type,\n name: \"Passkey\",\n // TODO: check that this works\n // supportsSimulation: true,\n\n async createPasskey() {\n const { id } = await createPasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n async reusePasskey() {\n const { id } = await reusePasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n hasPasskey() {\n return Object.keys(cache.getState().publicKeys).length > 0;\n },\n\n async connect(params) {\n console.log(\"connect\");\n // TODO: allow any chain?\n if (params?.chainId != null && params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n // attempt to reuse credential if this is called directly\n // TODO: move this into wallet so it's only triggered via rainbowkit?\n if (!cache.getState().activeCredential && !params?.isReconnecting) {\n await reusePasskey();\n }\n\n const accounts = await this.getAccounts();\n connected = accounts.length > 0;\n\n return { accounts, chainId };\n },\n async disconnect() {\n console.log(\"disconnect\");\n connected = false;\n cache.setState({ activeCredential: null });\n },\n async getAccounts() {\n console.log(\"getAccounts\");\n const id = cache.getState().activeCredential;\n if (!id) return [];\n\n try {\n console.log(\"getting account for credential\", id);\n const account = await getAccount(client, id);\n console.log(\"got account\", account);\n return [account.address];\n } catch (error) {\n console.log(\"could not get address for credential ID\", id);\n }\n\n return [];\n },\n async getChainId() {\n return chainId;\n },\n async isAuthorized() {\n console.log(\"isAuthorized\");\n if (!connected) return false;\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n },\n async switchChain(params) {\n // TODO: allow any chain?\n if (params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n const chain = config.chains.find((c) => c.id === params.chainId);\n if (!chain) throw new SwitchChainError(new ChainNotConfiguredError());\n return chain;\n },\n onAccountsChanged(accounts) {\n console.log(\"onAccountsChanged\");\n if (accounts.length > 0) {\n config.emitter.emit(\"change\", {\n accounts: accounts.map((a) => getAddress(a)),\n });\n } else {\n this.onDisconnect();\n }\n },\n onChainChanged(chainId) {\n console.log(\"onChainChanged\");\n config.emitter.emit(\"change\", { chainId: Number(chainId) });\n },\n async onConnect(_connectInfo) {\n console.log(\"onConnect\");\n const accounts = await this.getAccounts();\n config.emitter.emit(\"connect\", { accounts, chainId });\n },\n async onDisconnect(_error) {\n console.log(\"onDisconnect\");\n config.emitter.emit(\"disconnect\");\n connected = false;\n },\n\n // By default, connector clients are bound to a `json-rpc` account.\n // We provide our own `getClient` method here so that we can return\n // a `smart` account, which is necessary for using with Viem's\n // account abstraction actions (i.e. user ops).\n //\n // Although Wagmi recommends connectors be tree-shakable, we return\n // an extended client here so that this client works with native\n // Wagmi hooks. Otherwise the app needs to build its own client, then\n // wrap each call in its own react-query hooks.\n async getClient(params) {\n console.log(\"passkeyConnector.getClient\", params);\n\n const credentialId = cache.getState().activeCredential;\n if (!credentialId) throw new Error(\"Not connected.\");\n\n const account = await getAccount(client, credentialId);\n\n return createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account,\n })\n .extend(smartAccountActions())\n .extend((client) => (explorerUrl ? observer({ explorerUrl })(client) : {}));\n },\n\n async getProvider(_params) {\n // TODO: chain specific provider?\n // TODO: is turning off retryCount important? is wrapping in this way enough to turn off retries?\n return custom({ request: client.transport.request })({ retryCount: 0 });\n },\n };\n });\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { P256Credential } from \"viem/account-abstraction\";\nimport { Address } from \"viem\";\n\n// TODO: move this to wagmi storage?\n// when I tried, it blew up TS complexity and my IDE was impossible to work with\n\nexport type State = {\n readonly publicKeys: {\n readonly [key in P256Credential[\"id\"]]?: P256Credential[\"publicKey\"];\n };\n readonly addresses: {\n readonly [key in P256Credential[\"id\"]]?: Address;\n };\n readonly activeCredential: P256Credential[\"id\"] | null;\n};\n\nexport const cache = createStore(\n persist<State>(\n () => ({\n publicKeys: {},\n addresses: {},\n activeCredential: null,\n }),\n { name: \"mud:passkey:cache\" },\n ),\n);\n\n// keep cache in sync across tabs/windows via storage event\nfunction listener(event: StorageEvent) {\n if (event.key === cache.persist.getOptions().name) {\n cache.persist.rehydrate();\n }\n}\nwindow.addEventListener(\"storage\", listener);\n","import { Client } from \"viem\";\nimport { toWebAuthnAccount } from \"viem/account-abstraction\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"webauthn-p256\";\nimport { toCoinbaseSmartAccount, ToCoinbaseSmartAccountReturnType } from \"../smart-account/toCoinbaseSmartAccount\";\n\nexport async function getAccount(client: Client, id: P256Credential[\"id\"]): Promise<ToCoinbaseSmartAccountReturnType> {\n const { publicKeys } = cache.getState();\n\n const publicKey = publicKeys[id];\n // TODO: should we prompt to recover key here?\n if (!publicKey) {\n throw new Error(\"No public key found for passkey credential.\");\n }\n\n const passkey = toWebAuthnAccount({ credential: { id, publicKey } });\n const owners = [passkey];\n\n return await toCoinbaseSmartAccount({ client, owners });\n}\n","// Forked from https://github.com/wevm/viem/blob/main/src/account-abstraction/accounts/implementations/toCoinbaseSmartAccount.ts\n// to match our forked contracts (upgrade to v0.7 entrypoint)\nimport { BaseError, type Address, type TypedData } from \"abitype\";\nimport {\n Client,\n OneOf,\n LocalAccount,\n Prettify,\n Assign,\n pad,\n encodeFunctionData,\n hashMessage,\n TypedDataDefinition,\n hashTypedData,\n Hash,\n encodeAbiParameters,\n stringToHex,\n size,\n encodePacked,\n parseSignature,\n} from \"viem\";\nimport {\n WebAuthnAccount,\n SmartAccount,\n SmartAccountImplementation,\n entryPoint07Abi,\n entryPoint07Address,\n getUserOperationHash,\n UserOperation,\n toSmartAccount,\n} from \"viem/account-abstraction\";\nimport { readContract } from \"viem/actions\";\nimport { type WebAuthnData, parseSignature as parseP256Signature, Hex } from \"webauthn-p256\";\n\nexport type ToCoinbaseSmartAccountParameters = {\n address?: Address | undefined;\n client: Client;\n owners: readonly OneOf<LocalAccount | WebAuthnAccount>[];\n nonce?: bigint | undefined;\n signer?: OneOf<LocalAccount | WebAuthnAccount>;\n};\n\nexport type ToCoinbaseSmartAccountReturnType = Prettify<SmartAccount<CoinbaseSmartAccountImplementation>>;\n\nexport type CoinbaseSmartAccountImplementation = Assign<\n SmartAccountImplementation<\n typeof entryPoint07Abi,\n \"0.7\",\n {\n __isCoinbaseSmartAccount: true;\n abi: typeof abi;\n factory: { abi: typeof factoryAbi; address: Address };\n signer: OneOf<LocalAccount | WebAuthnAccount>;\n }\n >,\n {\n sign: NonNullable<SmartAccountImplementation[\"sign\"]>;\n // TODO: should this be inside `extend` of `SmartAccountImplementation`?\n isOwner: (account: LocalAccount | WebAuthnAccount) => Promise<boolean>;\n }\n>;\n\n/**\n * @description Create a Coinbase Smart Account.\n *\n * @param parameters - {@link ToCoinbaseSmartAccountParameters}\n * @returns Coinbase Smart Account. {@link ToCoinbaseSmartAccountReturnType}\n *\n * @example\n * import { toCoinbaseSmartAccount } from 'viem/account-abstraction'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { client } from './client.js'\n *\n * const account = toCoinbaseSmartAccount({\n * client,\n * owners: [privateKeyToAccount('0x...')],\n * })\n */\nexport async function toCoinbaseSmartAccount(\n parameters: ToCoinbaseSmartAccountParameters,\n): Promise<ToCoinbaseSmartAccountReturnType> {\n const { client, owners, nonce = 0n } = parameters;\n\n let address = parameters.address;\n\n const entryPoint = {\n abi: entryPoint07Abi,\n address: entryPoint07Address,\n version: \"0.7\",\n } as const;\n const factory = {\n abi: factoryAbi,\n // TODO: make configurable?\n address: \"0x356336adA1619BeC1Ae4E6D94Dd9c0490DA414a8\",\n } as const;\n\n if (!owners.length) {\n throw new Error(\"`owners` must have at least one account.\");\n }\n\n function accountToBytes(account: LocalAccount | WebAuthnAccount) {\n return account.type === \"webAuthn\" ? account.publicKey : pad(account.address);\n }\n\n const owner = parameters.signer ?? owners[0];\n const ownerIndex = owners.indexOf(owner);\n if (ownerIndex === -1) {\n throw new Error(\"`signer` must be one of `owners`.\");\n }\n\n return toSmartAccount({\n client,\n entryPoint,\n\n extend: {\n __isCoinbaseSmartAccount: true as const,\n abi,\n factory,\n signer: owner,\n },\n\n async encodeCalls(calls) {\n if (calls.length === 1)\n return encodeFunctionData({\n abi,\n functionName: \"execute\",\n args: [calls[0].to, calls[0].value ?? 0n, calls[0].data ?? \"0x\"],\n });\n return encodeFunctionData({\n abi,\n functionName: \"executeBatch\",\n args: [\n calls.map((call) => ({\n data: call.data ?? \"0x\",\n target: call.to,\n value: call.value ?? 0n,\n })),\n ],\n });\n },\n\n async getAddress() {\n address ??= await readContract(client, {\n ...factory,\n functionName: \"getAddress\",\n args: [owners.map(accountToBytes), nonce],\n });\n return address;\n },\n\n async getFactoryArgs() {\n const factoryData = encodeFunctionData({\n abi: factory.abi,\n functionName: \"createAccount\",\n args: [owners.map(accountToBytes), nonce],\n });\n return { factory: factory.address, factoryData };\n },\n\n async getStubSignature() {\n if (owner.type === \"webAuthn\")\n // eslint-disable-next-line max-len\n return \"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000\";\n return wrapSignature({\n signature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n ownerIndex,\n });\n },\n\n async sign(parameters) {\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: parameters.hash,\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signMessage(parameters) {\n const { message } = parameters;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashMessage(message),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signTypedData(parameters) {\n const { domain, types, primaryType, message } = parameters as TypedDataDefinition<TypedData, string>;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashTypedData({\n domain,\n message,\n primaryType,\n types,\n }),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signUserOperation(parameters) {\n const { chainId = client.chain!.id, ...userOperation } = parameters;\n\n const address = await this.getAddress();\n const hash = getUserOperationHash({\n chainId,\n entryPointAddress: entryPoint.address,\n entryPointVersion: entryPoint.version,\n userOperation: {\n ...(userOperation as unknown as UserOperation),\n sender: address,\n },\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n userOperation: {\n async estimateGas(userOperation) {\n if (owner.type !== \"webAuthn\") return;\n\n // Accounts with WebAuthn owner require a minimum verification gas limit of 800,000.\n return {\n verificationGasLimit: BigInt(Math.max(Number(userOperation.verificationGasLimit ?? 0n), 800_000)),\n };\n },\n },\n\n async isOwner(account: LocalAccount | WebAuthnAccount) {\n return await readContract(client, {\n abi,\n address: await this.getAddress(),\n functionName: \"isOwnerBytes\",\n args: [accountToBytes(account)],\n });\n },\n });\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Utilities\n/////////////////////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport async function sign({ hash, owner }: { hash: Hash; owner: OneOf<LocalAccount | WebAuthnAccount> }) {\n // WebAuthn Account (Passkey)\n if (owner.type === \"webAuthn\") {\n const { signature, webauthn } = await owner.sign({\n hash,\n });\n return toWebAuthnSignature({ signature, webauthn });\n }\n\n if (owner.sign) return owner.sign({ hash });\n\n throw new BaseError(\"`owner` does not support raw sign.\");\n}\n\n/** @internal */\nexport function toReplaySafeHash({ address, chainId, hash }: { address: Address; chainId: number; hash: Hash }) {\n return hashTypedData({\n domain: {\n chainId,\n name: \"Coinbase Smart Wallet\",\n verifyingContract: address,\n version: \"1\",\n },\n types: {\n CoinbaseSmartWalletMessage: [\n {\n name: \"hash\",\n type: \"bytes32\",\n },\n ],\n },\n primaryType: \"CoinbaseSmartWalletMessage\",\n message: {\n hash,\n },\n });\n}\n\n/** @internal */\nexport function toWebAuthnSignature({ webauthn, signature }: { webauthn: WebAuthnData; signature: Hex }) {\n const { r, s } = parseP256Signature(signature);\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"authenticatorData\",\n type: \"bytes\",\n },\n { name: \"clientDataJSON\", type: \"bytes\" },\n { name: \"challengeIndex\", type: \"uint256\" },\n { name: \"typeIndex\", type: \"uint256\" },\n {\n name: \"r\",\n type: \"uint256\",\n },\n {\n name: \"s\",\n type: \"uint256\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n authenticatorData: webauthn.authenticatorData,\n clientDataJSON: stringToHex(webauthn.clientDataJSON),\n challengeIndex: BigInt(webauthn.challengeIndex),\n typeIndex: BigInt(webauthn.typeIndex),\n r,\n s,\n },\n ],\n );\n}\n\n/** @internal */\nexport function wrapSignature(parameters: { ownerIndex: number; signature: Hex }) {\n const { ownerIndex } = parameters;\n const signatureData = (() => {\n if (size(parameters.signature) !== 65) return parameters.signature;\n const signature = parseSignature(parameters.signature);\n return encodePacked([\"bytes32\", \"bytes32\", \"uint8\"], [signature.r, signature.s, signature.yParity === 0 ? 27 : 28]);\n })();\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"ownerIndex\",\n type: \"uint8\",\n },\n {\n name: \"signatureData\",\n type: \"bytes\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n ownerIndex,\n signatureData,\n },\n ],\n );\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Constants\n/////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const abi = [\n { inputs: [], stateMutability: \"nonpayable\", type: \"constructor\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"AlreadyOwner\",\n type: \"error\",\n },\n { inputs: [], name: \"Initialized\", type: \"error\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidEthereumAddressOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"key\", type: \"uint256\" }],\n name: \"InvalidNonceKey\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidOwnerBytesLength\",\n type: \"error\",\n },\n { inputs: [], name: \"LastOwner\", type: \"error\" },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"NoOwnerAtIndex\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"ownersRemaining\", type: \"uint256\" }],\n name: \"NotLastOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"selector\", type: \"bytes4\" }],\n name: \"SelectorNotAllowed\",\n type: \"error\",\n },\n { inputs: [], name: \"Unauthorized\", type: \"error\" },\n { inputs: [], name: \"UnauthorizedCallContext\", type: \"error\" },\n { inputs: [], name: \"UpgradeFailed\", type: \"error\" },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"expectedOwner\", type: \"bytes\" },\n { name: \"actualOwner\", type: \"bytes\" },\n ],\n name: \"WrongOwnerAtIndex\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"AddOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"RemoveOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"implementation\",\n type: \"address\",\n },\n ],\n name: \"Upgraded\",\n type: \"event\",\n },\n { stateMutability: \"payable\", type: \"fallback\" },\n {\n inputs: [],\n name: \"REPLAYABLE_NONCE_KEY\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owner\", type: \"address\" }],\n name: \"addOwnerAddress\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"addOwnerPublicKey\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"functionSelector\", type: \"bytes4\" }],\n name: \"canSkipChainIdValidation\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"domainSeparator\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"eip712Domain\",\n outputs: [\n { name: \"fields\", type: \"bytes1\" },\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"extensions\", type: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"entryPoint\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"execute\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"executeBatch\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"calls\", type: \"bytes[]\" }],\n name: \"executeWithoutChainIdValidation\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n ],\n name: \"getUserOpHashWithoutChainId\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"$\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owners\", type: \"bytes[]\" }],\n name: \"initialize\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"isOwnerAddress\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"bytes\" }],\n name: \"isOwnerBytes\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"isOwnerPublicKey\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"hash\", type: \"bytes32\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"isValidSignature\",\n outputs: [{ name: \"result\", type: \"bytes4\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextOwnerIndex\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"ownerAtIndex\",\n outputs: [{ name: \"\", type: \"bytes\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ownerCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"proxiableUUID\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeLastOwner\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeOwnerAtIndex\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"removedOwnersCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"hash\", type: \"bytes32\" }],\n name: \"replaySafeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"newImplementation\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"upgradeToAndCall\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n { name: \"userOpHash\", type: \"bytes32\" },\n { name: \"missingAccountFunds\", type: \"uint256\" },\n ],\n name: \"validateUserOp\",\n outputs: [{ name: \"validationData\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n { stateMutability: \"payable\", type: \"receive\" },\n] as const;\n\nconst factoryAbi = [\n {\n inputs: [{ name: \"implementation_\", type: \"address\" }],\n stateMutability: \"payable\",\n type: \"constructor\",\n },\n { inputs: [], name: \"OwnerRequired\", type: \"error\" },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"createAccount\",\n outputs: [\n {\n name: \"account\",\n type: \"address\",\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"getAddress\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"initCodeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { bytesToHex, hashMessage } from \"viem\";\nimport { sign } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { recoverPasskeyPublicKey } from \"./recoverPasskeyPublicKey\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function reusePasskey(): Promise<P256Credential> {\n const randomChallenge = bytesToHex(crypto.getRandomValues(new Uint8Array(256)));\n const messageHash = hashMessage(randomChallenge);\n const { signature, webauthn, raw: credential } = await sign({ hash: messageHash });\n\n const publicKey = await (async () => {\n const publicKey = cache.getState().publicKeys[credential.id];\n if (publicKey) return publicKey;\n\n // TODO: look up account/public key by credential ID once we store it onchain\n\n const webauthnHash = await getMessageHash(webauthn);\n const passkey = await recoverPasskeyPublicKey({\n credentialId: credential.id,\n messageHash: webauthnHash,\n signatureHex: signature,\n });\n if (!passkey) {\n throw new Error(\"recovery failed\");\n }\n if (passkey.credential.id !== credential.id) {\n throw new Error(\"wrong credential\");\n }\n\n cache.setState((state) => ({\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: passkey.publicKey,\n },\n }));\n\n return passkey.publicKey;\n })();\n\n console.log(\"recovered passkey\", credential.id, publicKey);\n\n cache.setState(() => ({\n activeCredential: credential.id,\n }));\n\n return { id: credential.id, publicKey, raw: credential };\n}\n","import { bytesToHex, Hex, hexToBytes, WebAuthnData } from \"webauthn-p256\";\nimport { concatBytes, utf8ToBytes } from \"@noble/curves/abstract/utils\";\n\n// lifted out of https://github.com/wevm/webauthn-p256/blob/main/src/verify.ts\n// TODO: submit a PR to lift this out as a function that can be exported\n\nexport async function getMessageHash(\n webauthn: Omit<WebAuthnData, \"typeIndex\" | \"challengeIndex\"> & {\n challengeIndex?: number;\n typeIndex?: number;\n },\n): Promise<Hex | never> {\n const {\n authenticatorData,\n challengeIndex: challengeIndexRaw,\n clientDataJSON,\n typeIndex: typeIndexRaw,\n userVerificationRequired,\n } = webauthn;\n\n const typeIndex = typeIndexRaw || clientDataJSON.indexOf('\"type\"');\n const challengeIndex = challengeIndexRaw || clientDataJSON.indexOf('\"challenge\"');\n\n const authenticatorDataBytes = hexToBytes(authenticatorData);\n\n // Check length of `authenticatorData`.\n if (authenticatorDataBytes.length < 37) throw new Error(\"Invalid authenticatorData\");\n\n const flag = authenticatorDataBytes[32]!;\n\n // Verify that the UP bit of the flags in authData is set.\n if ((flag & 0x01) !== 0x01) throw new Error(\"Invalid authenticatorData\");\n\n // If user verification was determined to be required, verify that\n // the UV bit of the flags in authData is set. Otherwise, ignore the\n // value of the UV flag.\n if (userVerificationRequired && (flag & 0x04) !== 0x04) throw new Error(\"Invalid authenticatorData\");\n\n // If the BE bit of the flags in authData is not set, verify that\n // the BS bit is not set.\n if ((flag & 0x08) !== 0x08 && (flag & 0x10) === 0x10) throw new Error(\"Invalid authenticatorData\");\n\n // Check that response is for an authentication assertion\n const type = '\"type\":\"webauthn.get\"';\n if (type !== clientDataJSON.slice(Number(typeIndex), type.length + 1)) throw new Error(\"Invalid clientDataJSON\");\n\n // Check that hash is in the clientDataJSON.\n const match = clientDataJSON.slice(Number(challengeIndex)).match(/^\"challenge\":\"(.*?)\"/);\n if (!match) throw new Error(\"Invalid clientDataJSON\");\n\n const clientDataJSONHash = new Uint8Array(await crypto.subtle.digest(\"SHA-256\", utf8ToBytes(clientDataJSON)));\n const messageHash = new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", concatBytes(hexToBytes(authenticatorData), clientDataJSONHash)),\n );\n\n return bytesToHex(messageHash);\n}\n","import { sign } from \"webauthn-p256\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { getCandidatePublicKeys } from \"./getCandidatePublicKeys\";\nimport { SignatureAndMessage } from \"./common\";\nimport { hashMessage, Hex } from \"viem\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport function findPublicKey([input1, input2]: [SignatureAndMessage, SignatureAndMessage]): Hex | undefined {\n // Return the candidate public key that appears twice\n return firstDuplicate([...getCandidatePublicKeys(input1), ...getCandidatePublicKeys(input2)]);\n}\n\nexport async function recoverPasskeyPublicKey(input: { credentialId: P256Credential[\"id\"] } & SignatureAndMessage) {\n const message2 = hashMessage(input.signatureHex);\n const {\n signature: signature2,\n webauthn: webauthn2,\n raw: credential,\n } = await sign({ credentialId: input.credentialId, hash: message2 });\n const messageHash2 = await getMessageHash(webauthn2);\n\n const publicKey = findPublicKey([input, { signatureHex: signature2, messageHash: messageHash2 }]);\n if (publicKey) {\n return { publicKey, credential };\n }\n}\n\nfunction firstDuplicate<T>(arr: T[]): T | undefined {\n const seen = new Set<T>();\n for (const s of arr) {\n if (seen.has(s)) {\n return s;\n }\n seen.add(s);\n }\n return undefined;\n}\n","import { parseSignature, serializePublicKey } from \"webauthn-p256\";\nimport { SignatureAndMessage } from \"./common\";\nimport { secp256r1 } from \"@noble/curves/p256\";\n\nexport function getCandidatePublicKeys(input: SignatureAndMessage) {\n const { r, s } = parseSignature(input.signatureHex);\n\n const candidate1 = new secp256r1.Signature(r, s).addRecoveryBit(1).recoverPublicKey(input.messageHash.slice(2));\n const candidate2 = new secp256r1.Signature(r, s).addRecoveryBit(0).recoverPublicKey(input.messageHash.slice(2));\n\n return [serializePublicKey(candidate1), serializePublicKey(candidate2)];\n}\n","import { createCredential } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function createPasskey(): Promise<P256Credential> {\n const credential = await createCredential({ name: \"MUD Account\" });\n console.log(\"created passkey\", credential);\n\n cache.setState((state) => ({\n activeCredential: credential.id,\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: credential.publicKey,\n },\n }));\n\n return credential;\n}\n","import { resourceToHex } from \"@latticexyz/common\";\nimport { Client, Chain, Transport, Account, parseAbi, ClientConfig, Address } from \"viem\";\nimport worldConfig from \"@latticexyz/world/mud.config\";\n\nexport type ConnectedClient<chain extends Chain = Chain> = Client<Transport, chain, Account>;\nexport type AppAccountClient<chain extends Chain = Chain> = ConnectedClient<chain> & { readonly userAddress: Address };\n\nexport const defaultClientConfig = {\n pollingInterval: 250,\n} as const satisfies Pick<ClientConfig, \"pollingInterval\">;\n\nexport const unlimitedDelegationControlId = resourceToHex({ type: \"system\", namespace: \"\", name: \"unlimited\" });\n\nexport const worldTables = worldConfig.namespaces.world.tables;\n\nexport const worldAbi = parseAbi([\n \"function registerDelegation(address delegatee, bytes32 delegationControlId, bytes initCallData)\",\n]);\n","import { Transport, Chain, Client, RpcSchema, Address } from \"viem\";\nimport {\n BundlerClient,\n BundlerClientConfig,\n SmartAccount,\n createBundlerClient as viem_createBundlerClient,\n} from \"viem/account-abstraction\";\nimport { defaultClientConfig } from \"./common\";\n\nconst knownChainFees = new Set([\n // anvil hardcodes fee returned by `eth_maxPriorityFeePerGas`\n // so we have to override it here\n // https://github.com/foundry-rs/foundry/pull/8081#issuecomment-2402002485\n 31337,\n // rhodolite\n 17420,\n // garnet\n 17069,\n // redstone\n 690,\n]);\n\nexport function createBundlerClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n account extends SmartAccount | undefined = undefined,\n client extends Client | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>({\n paymasterAddress,\n ...config\n}: BundlerClientConfig<transport, chain, account, client, rpcSchema> & { paymasterAddress: Address }): BundlerClient<\n transport,\n chain,\n account,\n client,\n rpcSchema\n> {\n const chain = config.chain ?? config.client?.chain;\n return viem_createBundlerClient({\n ...defaultClientConfig,\n paymaster: {\n getPaymasterData: async () => ({\n // TODO: source this from the chain config instead\n paymaster: paymasterAddress,\n paymasterData: \"0x\",\n }),\n },\n userOperation: {\n estimateFeesPerGas:\n // TODO: source this from the chain config instead\n chain && knownChainFees.has(chain.id)\n ? async () => ({\n maxFeePerGas: 100_000n,\n maxPriorityFeePerGas: 0n,\n })\n : undefined,\n },\n ...config,\n });\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function Logo({ className, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n fill=\"currentColor\"\n shapeRendering=\"crispEdges\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {/* eslint-disable-next-line max-len */}\n <path d=\"M0 0h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm2-1h1v1H7zm0 1h1v1H7zM6 7h1v1H6zm1-2h1v1H7zm0-1h1v1H7zm0-1h1v1H7z\" />\n <path\n d=\"M2 2h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm1-3h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm0 1h1v1H5zm0 1h1v1H5zm0 1h1v1H5zM4 5h1v1H4zM3 5h1v1H3z\"\n opacity=\".5\"\n />\n <path d=\"M7 2h1v1H7zm0-1h1v1H7zM1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm1 0h1v1H6zm1 0h1v1H7z\" />\n </svg>\n );\n}\n","import { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useAppInfo() {\n const { appInfo } = useEntryKitConfig();\n\n const appName = appInfo?.name ?? document.title;\n // TODO: should origin be set in config and validated against current host?\n const appOrigin = location.host;\n const appIcon = appInfo?.icon ?? document.querySelector(\"link[rel~='icon']\")?.getAttribute(\"href\") ?? \"/favico.ico\";\n const appImage = appInfo?.image;\n\n return { appName, appOrigin, appIcon, appImage };\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nexport function usePreloadImage(url: string | undefined) {\n return useQuery({\n enabled: !!url,\n retry: false,\n retryOnMount: false,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n queryKey: [url],\n queryFn: () =>\n new Promise<InstanceType<typeof Image>>((resolve, reject) => {\n if (!url) throw new Error(\"usePreloadImage: Must provide `url` to preload image.\");\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`usePreloadImage: Could not load image.\\n\\n\\tURL: ${url}`));\n image.src = url;\n }),\n });\n}\n","import { Logo } from \"./icons/Logo\";\nimport { useAppInfo } from \"./useAppInfo\";\nimport { usePreloadImage } from \"./usePreloadImage\";\n\nexport function AppInfo() {\n const { appName, appIcon } = useAppInfo();\n\n const { data: hasAppIcon, isLoading: appIconLoading } = usePreloadImage(appIcon);\n\n return (\n <div className=\"flex-grow flex flex-col items-center justify-center gap-2\">\n <div className=\"w-16 h-16 m-2\">\n {!appIconLoading ? (\n hasAppIcon ? (\n <img src={appIcon} className=\"w-full h-full object-cover\" />\n ) : (\n // TODO: swap with favicon\n <Logo className=\"w-full h-full text-orange-500 dark:bg-neutral-800\" />\n )\n ) : null}\n </div>\n <div className=\"text-2xl text-white text-center\">{appName}</div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { useSteps } from \"./useSteps\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n userClient: ConnectedClient;\n};\n\nexport function ConnectedSteps({ userClient }: Props) {\n const steps = useSteps(userClient);\n\n // TODO: detect if just connected and, if so, dismiss\n\n const [selectedStepId] = useState<null | string>(null);\n const nextStep = steps.find((step) => step.content != null && !step.isComplete);\n const completedSteps = steps.filter((step) => step.isComplete);\n const activeStep =\n (selectedStepId != null ? steps.find((step) => step.id === selectedStepId) : null) ??\n nextStep ??\n (completedSteps.length < steps.length ? completedSteps.at(-1) : null);\n const activeStepIndex = activeStep ? steps.indexOf(activeStep) : -1;\n\n return (\n <div\n className={twMerge(\n \"min-h-[26rem] px-8 flex flex-col divide-y divide-neutral-800\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\",\n )}\n >\n {steps.map((step, i) => {\n const isActive = step === activeStep;\n const isExpanded = isActive || completedSteps.length === steps.length;\n const isDisabled = !step.isComplete && activeStepIndex !== -1 && i > activeStepIndex;\n return (\n <div key={step.id} className={twMerge(\"py-8 flex flex-col justify-center\", isActive ? \"flex-grow\" : null)}>\n <div className={twMerge(\"flex flex-col\", isDisabled ? \"opacity-30 pointer-events-none\" : null)}>\n {step.content({ isActive, isExpanded })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { Step, minGasBalance } from \"./common\";\nimport { useAllowance } from \"./useAllowance\";\nimport { useAppAccountClient } from \"../useAppAccountClient\";\nimport { useSpender } from \"./useSpender\";\nimport { useDelegation } from \"./useDelegation\";\nimport { Wallet } from \"./Wallet\";\nimport { Allowance } from \"./Allowance\";\nimport { Session } from \"./Session\";\n\nexport function useSteps(userClient: ConnectedClient | undefined): readonly Step[] {\n const userAddress = userClient?.account.address;\n const allowance = useAllowance(userAddress);\n const appAccountClient = useAppAccountClient(userAddress);\n\n const spender = useSpender(userAddress, appAccountClient.data?.account.address);\n const isSpender = spender.data === true;\n\n const delegation = useDelegation(userAddress, appAccountClient.data?.account.address);\n const hasDelegation = delegation.data === true;\n\n return useMemo(() => {\n if (!userAddress) {\n return [\n {\n id: \"wallet\",\n label: \"Sign in\",\n isComplete: false,\n content: () => null,\n },\n ];\n }\n\n return [\n {\n id: \"wallet\",\n label: \"Sign in\",\n isComplete: true,\n content: (props) => <Wallet {...props} userAddress={userAddress} />,\n },\n {\n id: \"allowance\",\n label: \"Top up\",\n isComplete: (allowance.data?.allowance ?? 0n) >= minGasBalance,\n content: (props) => <Allowance {...props} userAddress={userAddress} />,\n },\n {\n id: \"session\",\n label: \"Set up account\",\n isComplete: isSpender && hasDelegation,\n content: (props) => (\n <Session\n {...props}\n userClient={userClient}\n registerSpender={!isSpender}\n registerDelegation={!hasDelegation}\n />\n ),\n },\n ];\n }, [allowance.data?.allowance, hasDelegation, isSpender, userAddress, userClient]);\n}\n","import { ReactNode } from \"react\";\nimport { parseEther } from \"viem\";\n\nexport type Step = {\n id: string;\n label: string;\n isComplete: boolean;\n content: (props: { isActive: boolean; isExpanded: boolean }) => ReactNode;\n};\n\nexport const minGasBalance = parseEther(\"0.01\");\n","import { Table } from \"@latticexyz/config\";\nimport { UseReadContractParameters, UseReadContractReturnType, useReadContract } from \"wagmi\";\nimport IStoreReadAbi from \"@latticexyz/store/out/IStoreRead.sol/IStoreRead.abi.json\";\nimport {\n decodeValueArgs,\n getKeySchema,\n getKeyTuple,\n getSchemaPrimitives,\n getSchemaTypes,\n getValueSchema,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { Hex } from \"viem\";\nimport { show } from \"@ark/util\";\n\n// TODO: move to our own useQuery so we can control the query key\n\nexport function useRecord<table extends Table>({\n table,\n key,\n ...opts\n}: Omit<\n UseReadContractParameters<typeof IStoreReadAbi, \"getRecord\", [Hex, readonly Hex[]]>,\n \"abi\" | \"functionName\" | \"args\"\n> & {\n readonly table?: table;\n readonly key?: getSchemaPrimitives<getKeySchema<table>>;\n}): UseReadContractReturnType<\n typeof IStoreReadAbi,\n \"getRecord\",\n readonly [Hex, readonly Hex[]],\n show<getSchemaPrimitives<table[\"schema\"]>>\n> {\n return useReadContract(\n table && key && opts.query?.enabled !== false\n ? {\n ...opts,\n abi: IStoreReadAbi,\n functionName: \"getRecord\",\n args: [table.tableId, getKeyTuple(table, key)],\n query: {\n ...opts.query,\n select: (data) => ({\n ...key,\n ...decodeValueArgs(getSchemaTypes(getValueSchema(table)), {\n staticData: (data as [Hex, Hex, Hex])[0],\n encodedLengths: (data as [Hex, Hex, Hex])[1],\n dynamicData: (data as [Hex, Hex, Hex])[2],\n }),\n }),\n },\n }\n : {},\n );\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: whole ABI\nexport const paymasterAbi = parseAbi([\n \"error SpenderSystem_AlreadyRegistered(address spender, address user)\",\n \"error SpenderSystem_HasOwnBalance(address spender)\",\n \"function registerSpender(address spender)\",\n]);\n\nexport const paymasterConfig = defineStore({\n namespaces: {\n root: {\n namespace: \"\",\n tables: {\n Allowance: {\n schema: {\n user: \"address\",\n allowance: \"uint256\",\n },\n key: [\"user\"],\n },\n Grantor: {\n schema: {\n grantor: \"address\",\n allowance: \"uint256\",\n },\n key: [\"grantor\"],\n },\n PassHolder: {\n schema: {\n user: \"address\",\n passId: \"bytes32\",\n lastRenewed: \"uint256\",\n lastClaimed: \"uint256\",\n },\n key: [\"user\", \"passId\"],\n },\n PassConfig: {\n schema: {\n passId: \"bytes32\",\n claimAmount: \"uint256\",\n claimInterval: \"uint256\",\n validityPeriod: \"uint256\",\n grantor: \"address\",\n },\n key: [\"passId\"],\n },\n Spender: {\n schema: {\n spender: \"address\",\n user: \"address\",\n },\n key: [\"spender\"],\n },\n SystemConfig: {\n schema: {\n entryPoint: \"address\",\n },\n key: [],\n },\n },\n },\n },\n});\n\nexport const paymasterTables = paymasterConfig.namespaces.root.tables;\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useRecord } from \"../useRecord\";\nimport { paymasterTables } from \"../paymaster\";\n\nexport function useAllowance(user: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n\n return useRecord({\n chainId,\n address: paymasterAddress,\n ...(user\n ? {\n table: paymasterTables.Allowance,\n key: { user },\n }\n : null),\n });\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UseQueryResult, useQuery } from \"@tanstack/react-query\";\nimport { getAppAccountClient } from \"./getAppAccountClient\";\nimport { AppAccountClient } from \"./common\";\n\nexport function useAppAccountClient(userAddress: Address | undefined): UseQueryResult<AppAccountClient> {\n const { chainId, bundlerTransport, paymasterAddress, worldAddress, explorerUrl } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const queryKey = [\"appAccountClient\", client?.uid, userAddress];\n return useQuery(\n client && userAddress\n ? {\n queryKey,\n queryFn: async () => {\n return await getAppAccountClient({\n worldAddress,\n userAddress,\n client,\n bundlerTransport,\n paymasterAddress,\n explorerUrl,\n });\n },\n staleTime: Infinity,\n }\n : { queryKey, enabled: false },\n );\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { Address, Hex } from \"viem\";\n\nexport type State = {\n readonly appSigners: {\n readonly [key in Address]?: Hex;\n };\n};\n\nexport const store = createStore(\n persist<State>(\n () => ({\n appSigners: {},\n }),\n {\n name: \"mud:entrykit\",\n partialize: ({ appSigners }) => ({ appSigners }),\n },\n ),\n);\n\n// keep store in sync across tabs/windows via storage event\nfunction listener(event: StorageEvent) {\n if (event.key === store.persist.getOptions().name) {\n store.persist.rehydrate();\n }\n}\nwindow.addEventListener(\"storage\", listener);\n","import { Address } from \"viem\";\nimport { store } from \"./onboarding/store\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport function getAppSigner(userAddress: Address) {\n const appSignerPrivateKey =\n store.getState().appSigners[userAddress] ??\n (() => {\n const privateKey = generatePrivateKey();\n store.setState((state) => ({\n appSigners: {\n ...state.appSigners,\n [userAddress]: privateKey,\n },\n }));\n return privateKey;\n })();\n\n return privateKeyToAccount(appSignerPrivateKey);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { getAppSigner } from \"./getAppSigner\";\nimport { toCoinbaseSmartAccount } from \"./smart-account/toCoinbaseSmartAccount\";\nimport { smartAccountActions } from \"permissionless\";\nimport { callFrom } from \"@latticexyz/world/internal\";\nimport { createBundlerClient } from \"./createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\nimport { AppAccountClient } from \"./common\";\n\nexport async function getAppAccountClient<chain extends Chain>({\n worldAddress,\n userAddress,\n client,\n bundlerTransport,\n paymasterAddress,\n explorerUrl,\n}: {\n worldAddress: Address;\n userAddress: Address;\n client: Client<Transport, chain>;\n bundlerTransport: Transport;\n paymasterAddress: Address;\n explorerUrl?: string;\n}): Promise<AppAccountClient<chain>> {\n const appSigner = getAppSigner(userAddress);\n const account = await toCoinbaseSmartAccount({ client, owners: [appSigner] });\n\n const appAccountClient = createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account,\n })\n .extend(smartAccountActions())\n .extend(callFrom({ worldAddress, delegatorAddress: userAddress, publicClient: client }))\n .extend((client) => (explorerUrl ? observer({ explorerUrl })(client) : {}))\n .extend(() => ({ userAddress }));\n\n return appAccountClient;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { paymasterTables } from \"../paymaster\";\nimport { useClient } from \"wagmi\";\nimport { getRecord } from \"../utils/getRecord\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nexport function getSpenderQueryKey({\n client,\n paymasterAddress,\n userAddress,\n appAccountAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n paymasterAddress: Address;\n userAddress: Address | undefined;\n appAccountAddress: Address | undefined;\n}) {\n return [\"spender\", client?.chain.id, paymasterAddress, userAddress, appAccountAddress];\n}\n\nexport function useSpender(userAddress: Address | undefined, appAccountAddress: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const queryKey = getSpenderQueryKey({ client, paymasterAddress, userAddress, appAccountAddress });\n return useQuery(\n client && userAddress && appAccountAddress\n ? {\n queryKey,\n queryFn: async () => {\n const record = await getRecord(client, {\n address: paymasterAddress,\n table: paymasterTables.Spender,\n key: { spender: appAccountAddress },\n });\n return record.user.toLowerCase() === userAddress.toLowerCase();\n },\n }\n : { queryKey, enabled: false },\n );\n}\n","import { Address, Client, Hex } from \"viem\";\nimport { Table } from \"@latticexyz/config\";\nimport {\n decodeValueArgs,\n getKeySchema,\n getKeyTuple,\n getSchemaPrimitives,\n getSchemaTypes,\n getValueSchema,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { readContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\n// TODO: move this to store package or similar\n\nexport type GetRecordOptions<table extends Table> = {\n address: Address;\n table: table;\n key: getSchemaPrimitives<getKeySchema<table>>;\n blockTag?: \"latest\" | \"pending\";\n};\n\nexport async function getRecord<table extends Table>(\n client: Client,\n { address, table, key, blockTag }: GetRecordOptions<table>,\n): Promise<getSchemaPrimitives<table[\"schema\"]>> {\n const [staticData, encodedLengths, dynamicData] = await getAction(\n client,\n readContract,\n \"readContract\",\n )({\n address,\n abi,\n functionName: \"getRecord\",\n args: [table.tableId, getKeyTuple(table, key) as readonly Hex[]],\n blockTag,\n });\n\n return {\n ...key,\n ...decodeValueArgs(getSchemaTypes(getValueSchema(table)), { staticData, encodedLengths, dynamicData }),\n };\n}\n\nconst abi = [\n {\n type: \"function\",\n name: \"getRecord\",\n inputs: [\n {\n name: \"tableId\",\n type: \"bytes32\",\n internalType: \"ResourceId\",\n },\n {\n name: \"keyTuple\",\n type: \"bytes32[]\",\n internalType: \"bytes32[]\",\n },\n ],\n outputs: [\n {\n name: \"staticData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"encodedLengths\",\n type: \"bytes32\",\n internalType: \"EncodedLengths\",\n },\n {\n name: \"dynamicData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { getRecord } from \"../utils/getRecord\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { unlimitedDelegationControlId, worldTables } from \"../common\";\n\nexport function getDelegationQueryKey({\n client,\n worldAddress,\n userAddress,\n appAccountAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n worldAddress: Address;\n userAddress: Address | undefined;\n appAccountAddress: Address | undefined;\n}) {\n return [\"delegation\", client?.chain.id, worldAddress, userAddress, appAccountAddress];\n}\n\nexport function useDelegation(userAddress: Address | undefined, appAccountAddress: Address | undefined) {\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const queryKey = getDelegationQueryKey({ client, worldAddress, userAddress, appAccountAddress });\n return useQuery(\n client && userAddress && appAccountAddress\n ? {\n queryKey,\n queryFn: async () => {\n const record = await getRecord(client, {\n address: worldAddress,\n table: worldTables.UserDelegationControl,\n key: { delegator: userAddress, delegatee: appAccountAddress },\n });\n return record.delegationControlId === unlimitedDelegationControlId;\n },\n }\n : { queryKey, enabled: false },\n );\n}\n","import { useDisconnect } from \"wagmi\";\nimport { useENS } from \"../useENS\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { Button } from \"../ui/Button\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { Hex } from \"viem\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useDisconnect();\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\n // TODO: display disconnect error as popover near button?\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Account</div>\n <div className=\"font-mono text-white\">{ens.name ?? <TruncatedHex hex={userAddress} />}</div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"secondary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\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 initialData: {\n address: undefined,\n name: undefined,\n displayName: undefined,\n avatar: undefined,\n },\n queryFn: async () => {\n // TODO: typed response\n const data = await fetch(`https://api.ensideas.com/ens/resolve/${normalizedAddress}`).then((res) => res.json());\n return {\n address: data.address ?? undefined,\n name: data.name ?? undefined,\n displayName: data.displayName ?? undefined,\n avatar: data.avatar ?? undefined,\n };\n },\n });\n}\n","import { Hex } from \"viem\";\n\nexport type Props = {\n hex: Hex;\n};\n\nexport function TruncatedHex({ hex }: Props) {\n if (hex.length <= 10) {\n return <span title={hex}>{hex}</span>;\n }\n\n return (\n <span title={hex}>\n <span className=\"after:select-none after:content-['…']\">{hex.slice(0, 6)}</span>\n <span className=\"tracking-[-1ch] text-transparent\">{hex.slice(6, -4)}</span>\n {hex.slice(-4)}\n </span>\n );\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport function useClaimGasPass() {\n const queryClient = useQueryClient();\n\n // TODO: add types for RPC methods\n // TODO: use client.request once this is behind proxyd\n const { passIssuerTransport } = useEntryKitConfig();\n return useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"claimGasPass\"],\n mutationFn: async (userAddress: Address) => {\n const transport = passIssuerTransport({ retryCount: 0 });\n await transport.request({\n method: \"quarry_issuePass\",\n params: [\"0x01\", userAddress],\n });\n await transport.request({\n method: \"quarry_claimAllowance\",\n params: [\"0x01\", userAddress],\n });\n\n await queryClient.invalidateQueries({ queryKey: [\"readContract\"] });\n },\n });\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function EthIcon({ className, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 263 428\"\n fill=\"currentColor\"\n className={twMerge(\"w-[0.6em] h-[1em]\", className)}\n {...props}\n >\n <path d=\"M132 321V428L263 243L132 321Z\" />\n <path d=\"M0 243L132 321V428\" fillOpacity=\"0.5\" />\n <path d=\"M132 0V296L263 218\" />\n <path d=\"M0 218L132 296V0L0 218Z\" fillOpacity=\"0.5\" />\n </svg>\n );\n}\n","import { formatEther } from \"viem\";\n\nexport function formatBalance(wei: bigint) {\n // TODO: should this support non-ether decimals?\n const formatted = formatEther(wei);\n const magnitude = Math.floor(parseFloat(formatted)).toString().length;\n return parseFloat(formatted).toLocaleString(\"en-US\", { maximumFractionDigits: Math.max(0, 6 - magnitude) });\n}\n","import { EthIcon } from \"../icons/EthIcon\";\nimport { formatBalance } from \"../formatBalance\";\n\ntype Props = {\n wei: bigint;\n};\n\nexport function Balance({ wei }: Props) {\n return (\n <span className=\"inline-flex items-center gap-1\">\n {formatBalance(wei)} <EthIcon />\n </span>\n );\n}\n","import { Hex } from \"viem\";\nimport { useAllowance } from \"./useAllowance\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\nimport { useClaimGasPass } from \"./useClaimGasPass\";\nimport { Button } from \"../ui/Button\";\nimport { Balance } from \"../ui/Balance\";\nimport { useEffect } from \"react\";\nimport { minGasBalance } from \"./common\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n userAddress: Hex;\n};\n\nexport function Allowance({ isActive, isExpanded, userAddress }: Props) {\n const allowance = useAllowance(userAddress);\n const claimGasPass = useClaimGasPass();\n\n // TODO: improve pending state since this is kicked off automatically and showing a pending button is weird\n useEffect(() => {\n if (isActive && claimGasPass.status === \"idle\" && allowance.data && allowance.data.allowance < minGasBalance) {\n claimGasPass.mutate(userAddress);\n }\n }, [allowance.data, claimGasPass, isActive, userAddress]);\n\n // TODO: show error if allowance fails to load\n // TODO: show claim error\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Allowance</div>\n <div className=\"font-mono text-white\">\n {allowance.data ? <Balance wei={allowance.data.allowance} /> : <PendingIcon />}\n </div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"secondary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n 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 { Address, ContractFunctionParameters, Abi } from \"viem\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { getAction } from \"viem/utils\";\nimport { sendUserOperation, waitForUserOperationReceipt } from \"viem/account-abstraction\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { ConnectedClient, unlimitedDelegationControlId, worldAbi } from \"../common\";\nimport { paymasterAbi } from \"../paymaster\";\nimport { writeContract } from \"viem/actions\";\nimport { getSpenderQueryKey } from \"./useSpender\";\nimport { getDelegationQueryKey } from \"./useDelegation\";\n\nfunction defineCall<abi extends Abi | readonly unknown[]>(\n call: Omit<ContractFunctionParameters<abi>, \"address\"> & {\n to: Address;\n value?: bigint | undefined;\n },\n) {\n return call;\n}\n\nexport function useSetupAppAccount() {\n const { worldAddress, paymasterAddress } = useEntryKitConfig();\n const queryClient = useQueryClient();\n\n return useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"setupAppAccount\"],\n mutationFn: async ({\n userClient,\n appAccountAddress,\n registerSpender,\n registerDelegation,\n }: {\n userClient: ConnectedClient;\n appAccountAddress: Address;\n registerSpender: boolean;\n registerDelegation: boolean;\n }): Promise<void> => {\n // TODO: for non-smart accounts, collect signatures and store to be executed later?\n if (userClient.account.type !== \"smart\") {\n await getAction(\n userClient,\n writeContract,\n \"writeContract\",\n )({\n chain: userClient.chain,\n account: userClient.account,\n address: paymasterAddress,\n abi: paymasterAbi,\n functionName: \"registerSpender\",\n args: [appAccountAddress],\n });\n await getAction(\n userClient,\n writeContract,\n \"writeContract\",\n )({\n chain: userClient.chain,\n account: userClient.account,\n address: worldAddress,\n abi: worldAbi,\n functionName: \"registerDelegation\",\n args: [appAccountAddress, unlimitedDelegationControlId, \"0x\"],\n });\n }\n\n const calls = [];\n\n if (registerSpender) {\n console.log(\"registering spender\");\n calls.push(\n defineCall({\n to: paymasterAddress,\n abi: paymasterAbi,\n functionName: \"registerSpender\",\n args: [appAccountAddress],\n }),\n );\n }\n\n if (registerDelegation) {\n console.log(\"registering delegation\");\n calls.push(\n defineCall({\n to: worldAddress,\n abi: worldAbi,\n functionName: \"registerDelegation\",\n args: [appAccountAddress, unlimitedDelegationControlId, \"0x\"],\n }),\n );\n }\n\n if (!calls.length) return;\n\n console.log(\"setting up account with\", calls);\n const hash = await getAction(userClient, sendUserOperation, \"sendUserOperation\")({ calls });\n console.log(\"got user op hash\", hash);\n\n const receipt = await getAction(userClient, waitForUserOperationReceipt, \"waitForUserOperationReceipt\")({ hash });\n console.log(\"got user op receipt\", receipt);\n\n await queryClient.invalidateQueries({ queryKey: [\"readContract\"] });\n\n // TODO: throw if revert?\n if (!receipt.success) return;\n\n if (registerSpender) {\n const queryKey = getSpenderQueryKey({\n client: userClient,\n paymasterAddress,\n userAddress: userClient.account.address,\n appAccountAddress,\n });\n queryClient.setQueryData(queryKey, true);\n }\n\n if (registerDelegation) {\n const queryKey = getDelegationQueryKey({\n client: userClient,\n worldAddress,\n userAddress: userClient.account.address,\n appAccountAddress,\n });\n queryClient.setQueryData(queryKey, true);\n }\n },\n });\n}\n","import { useAppAccountClient } from \"../useAppAccountClient\";\nimport { Button } from \"../ui/Button\";\nimport { useSetupAppAccount } from \"./useSetupAppAccount\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { ConnectedClient } from \"../common\";\n\nexport type Props = {\n 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 { closeAccountModal } = useAccountModal();\n const appAccountClient = useAppAccountClient(userClient.account.address);\n const setup = useSetupAppAccount();\n\n const isReady = !registerDelegation && !registerDelegation;\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\">{isReady ? \"Enabled\" : \"Set up\"}</div>\n </div>\n {isReady ? (\n <Button variant={isActive ? \"primary\" : \"secondary\"} className=\"flex-shrink-0 text-sm p-1 w-28\" disabled>\n {/* TODO: revoke */}\n Disable\n </Button>\n ) : (\n <Button\n variant={isActive ? \"primary\" : \"secondary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n pending={!appAccountClient.data || setup.status === \"pending\"}\n onClick={\n appAccountClient.data\n ? async () => {\n await setup.mutateAsync({\n userClient,\n appAccountAddress: appAccountClient.data.account.address,\n registerSpender,\n registerDelegation,\n });\n closeAccountModal();\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 { ReactNode, useState } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { ErrorNotice } from \"./ErrorNotice\";\nimport { wait } from \"@latticexyz/common/utils\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useIsMounted } from \"usehooks-ts\";\nimport { PendingIcon } from \"./icons/PendingIcon\";\n\nexport type Props = {\n children: ReactNode;\n};\n\nexport function AccountModalErrorBoundary({ children }: Props) {\n const isMounted = useIsMounted();\n const [retries, setRetries] = useState(1);\n\n // TODO: invalidate query cache?\n\n return (\n <ErrorBoundary\n fallbackRender={({ error, resetErrorBoundary }) => (\n <div className={twMerge(\"flex-grow flex flex-col justify-center p-5 gap-2\")}>\n <ErrorNotice error={error instanceof Error ? error.stack ?? error.message : error} />\n {retries > 0 ? (\n <button\n type=\"button\"\n onClick={async (event) => {\n // fake pending state while we retry so that if the same error occurs,\n event.currentTarget.ariaBusy = \"true\";\n await wait(1000);\n resetErrorBoundary();\n if (isMounted()) {\n setRetries((value) => value - 1);\n event.currentTarget.ariaBusy = null;\n }\n }}\n className=\"group aria-busy:pointer-events-none self-end flex items-center gap-1\"\n >\n <PendingIcon className=\"transition opacity-0 group-aria-busy:opacity-100 text-xs text-neutral-500 dark:text-neutral-400\" />\n <span className=\"text-sm text-neutral-500 dark:text-neutral-400 group-hover:text-black dark:group-hover:text-white\">\n Retry?\n </span>\n </button>\n ) : null}\n </div>\n )}\n >\n {children}\n </ErrorBoundary>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { BaseError, UserRejectedRequestError } from \"viem\";\n\nexport type Props = {\n title?: string;\n error?: unknown;\n};\n\nexport function ErrorNotice({ title: initialTitle, error }: Props) {\n if (!error) return null;\n // no need to let users know they rejected\n if (error instanceof BaseError && error.walk((e) => e instanceof UserRejectedRequestError) != null) {\n return null;\n }\n\n // TODO: extract title from error name or first line of error message?\n const title = initialTitle ?? \"Error\";\n\n // TODO: do something to protect against `[object Object]`\n const message =\n typeof error === \"string\" ? error : error instanceof Error ? String(error) : \"Something unexpected happened.\";\n\n // TODO: add \"report error\" link\n\n return (\n <div\n className={twMerge(\n \"text-sm border-l-4 border-red-500\",\n \"bg-red-100 text-red-900\",\n \"dark:bg-red-900 dark:text-red-50\",\n )}\n >\n <div className=\"p-3 font-semibold\">{title}</div>\n <div className=\"px-3 whitespace-break-spaces break-all max-h-32 overflow-y-scroll\">{message}</div>\n </div>\n );\n}\n","import { SVGProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = SVGProps<SVGSVGElement>;\n\nexport function IconSVG({ className, children, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {children}\n </svg>\n );\n}\n","import { IconSVG, Props } from \"./IconSVG\";\n\nexport function CloseIcon(props: Props) {\n return (\n <IconSVG strokeWidth=\"2\" stroke=\"currentColor\" {...props}>\n <path\n d=\"M6 18L18 6M6 6L18 18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { type ReactNode } from \"react\";\nimport { AccountModal } from \"./AccountModal\";\nimport { EntryKitConfig } from \"./config\";\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 { usePreparedAppAccountClient } from \"./usePreparedAppAccountClient\";\n\nconst containerClassNames = twMerge(\n \"w-48 inline-flex outline-none transition\",\n \"border border-transparent\",\n \"text-base leading-none\",\n);\n\nconst secondaryClassNames = twMerge(\n \"bg-neutral-100 border-neutral-300 text-black\",\n \"dark:bg-neutral-800 dark:border-neutral-700 dark:text-white\",\n);\nconst secondaryInteractiveClassNames = twMerge(\n \"cursor-pointer outline-none hover:bg-neutral-200 data-[highlighted]:bg-neutral-200 dark:hover:bg-neutral-700\",\n);\n\nexport function AccountButton() {\n const { openAccountModal, accountModalOpen } = useAccountModal();\n const { status, address } = useAccount();\n\n // TODO: use this to show indicator when onboarding is not complete\n usePreparedAppAccountClient();\n\n return (\n <Shadow mode=\"child\">\n {status === \"connected\" || (status === \"reconnecting\" && address) ? (\n <button\n // key is used to avoid triggering transitions between connected/disconnected states\n key=\"connected\"\n type=\"button\"\n className={twMerge(containerClassNames, secondaryClassNames, secondaryInteractiveClassNames, \"p-3\")}\n onClick={openAccountModal}\n >\n <span className=\"flex-grow inline-flex gap-2.5 items-center text-left font-medium\">\n <AccountName address={address} />\n </span>\n </button>\n ) : (\n <button\n // key is used to avoid triggering transitions between connected/disconnected states\n key=\"sign in\"\n type=\"button\"\n className={twMerge(\n containerClassNames,\n \"group\",\n \"items-center justify-center gap-2.5 p-3\",\n \"bg-orange-500 text-white font-medium\",\n \"hover:bg-orange-400\",\n \"active:bg-orange-600\",\n // \"aria-busy:saturate-50\",\n )}\n aria-busy={accountModalOpen}\n onClick={openAccountModal}\n >\n <span className=\"pointer-events-none inline-grid place-items-center -ml-3\">\n <span\n className={twMerge(\n \"col-start-1 row-start-1 leading-none\",\n \"scale-100 opacity-100 transition duration-300\",\n \"group-aria-busy:scale-125 group-aria-busy:opacity-0\",\n )}\n >\n <Logo />\n </span>\n <span\n aria-hidden\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"scale-50 opacity-0 transition duration-300 delay-50\",\n \"group-aria-busy:scale-100 group-aria-busy:opacity-100\",\n )}\n >\n <PendingIcon />\n </span>\n </span>\n <span className=\"font-medium\">Sign in</span>\n </button>\n )}\n </Shadow>\n );\n}\n","import { Hex } from \"viem\";\nimport { useENS } from \"./useENS\";\nimport { Logo } from \"./icons/Logo\";\nimport { TruncatedHex } from \"./ui/TruncatedHex\";\nimport { usePreloadImage } from \"./usePreloadImage\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n address: Hex | undefined;\n};\n\nexport function AccountName({ address }: Props) {\n const { data: ens } = useENS(address);\n const { isSuccess: hasAvatar } = usePreloadImage(ens.avatar);\n\n return (\n <>\n <span className=\"flex-shrink-0 w-6 h-6 -my-1 -mx-0.5 grid place-items-center\">\n <img\n src={hasAvatar ? ens.avatar : undefined}\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"inline-flex w-full h-full rounded-full bg-black/10 dark:bg-white/10 bg-cover bg-no-repeat bg-center\",\n hasAvatar ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <Logo\n className={twMerge(\n \"col-start-1 row-start-1 text-orange-500\",\n \"transition duration-300\",\n hasAvatar ? \"opacity-0\" : \"opacity-100\",\n )}\n />\n </span>\n <span className=\"flex-grow\">{ens.name ?? (address ? <TruncatedHex hex={address} /> : null)}</span>\n </>\n );\n}\n","// Used externally and only provides the app account client once all requirements are met.\n\nimport { useMemo } from \"react\";\nimport { useConnectorClient } from \"wagmi\";\nimport { useAppAccountClient } from \"./useAppAccountClient\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useSteps } from \"./onboarding/useSteps\";\nimport { AppAccountClient } from \"./common\";\n\nexport function usePreparedAppAccountClient(): AppAccountClient | undefined {\n const { chainId } = useEntryKitConfig();\n const { data: userClient, error: userClientError } = useConnectorClient({ chainId });\n if (userClientError) console.error(\"Error retrieving user client\", userClientError);\n\n const appAccountClient = useAppAccountClient(userClient?.account.address);\n const steps = useSteps(userClient);\n\n return useMemo(() => {\n if (!steps.every((step) => step.isComplete)) return;\n return appAccountClient.data;\n }, [appAccountClient.data, steps]);\n}\n","import { Chain, Transport } from \"viem\";\nimport { EntryKitConfig } from \"./config\";\nimport { WalletList, connectorsForWallets, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { createConfig } from \"wagmi\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\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> = Pick<EntryKitConfig, \"chainId\" | \"bundlerTransport\" | \"paymasterAddress\"> & {\n readonly chains: chains;\n readonly transports: transports;\n readonly walletConnectProjectId: string;\n readonly appInfo: {\n readonly name: string;\n };\n};\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n>(config: CreateWagmiConfigOptions<chains, transports>) {\n const { wallets: defaultWallets } = getDefaultWallets();\n const wallets: WalletList = [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n bundlerTransport: config.bundlerTransport,\n paymasterAddress: config.paymasterAddress,\n }),\n ],\n },\n ...defaultWallets,\n ];\n\n const connectors = connectorsForWallets(wallets, {\n appName: config.appInfo.name,\n projectId: config.walletConnectProjectId,\n });\n\n return createConfig({\n connectors,\n chains: config.chains,\n transports: config.transports,\n });\n}\n","import { Wallet } from \"@rainbow-me/rainbowkit\";\nimport { PasskeyConnectorOptions, passkeyConnector } from \"./passkeyConnector\";\n\nconst iconUrl = `data:image/svg+xml;base64,${btoa(\n // eslint-disable-next-line max-len\n '<svg xmlns=\"http://www.w3.org/2000/svg\" shape-rendering=\"geometricPrecision\" text-rendering=\"geometricPrecision\" image-rendering=\"optimizeQuality\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" width=\"512\" height=\"512\" viewBox=\"-64 -32 608 512\"><path d=\"M6.206 425.469A6.202 6.202 0 010 419.263c0-1.771.235-3.517.663-5.245 9.95-78.847 57.22-96.006 100.964-107.256 21.008-5.412 62.901-26.489 57.822-53.668-10.596-9.819-21.113-23.39-22.946-43.63l-1.274.026c-2.932-.044-5.778-.716-8.422-2.217-5.848-3.325-9.051-9.697-10.596-16.958-3.238-22.186-4.058-33.515 7.768-38.464l.096-.035c-1.467-27.37 3.159-67.64-24.944-76.141C154.622 7.1 218.597-30.203 266.627 30.805c53.519 2.801 77.389 78.611 44.154 121.046h-1.405c11.826 4.949 10.045 17.674 7.767 38.464-1.544 7.261-4.747 13.633-10.595 16.958-2.645 1.501-5.481 2.173-8.422 2.217l-1.275-.026c-1.833 20.24-12.376 33.811-22.972 43.63-4.459 23.871 27.275 43.011 49.33 50.997a139.442 139.442 0 004.268 5.525c-7.2 9.941-8.771 22.797-4.564 34.038-17.002 8.763-24.255 29.334-16.479 46.86-11.966 7.55-18.258 21.305-16.609 34.955H6.206zm419.058-105.362a86.778 86.778 0 0019.446-1.641c29.36-5.822 53.152-27.467 62.657-55.823 3.596-10.544 5.071-21.663 4.521-33.341-1.179-23.46-12.193-46.633-29.631-62.369-17.107-15.361-38.342-23.574-61.383-23.042-22.841.507-45.359 11.216-60.187 28.593-14.977 17.551-22.003 39.144-20.921 62.133.585 11.661 3.482 23.016 8.737 34.074 7.741 16.303 19.934 29.735 35.391 39.048l-22.457 20.711 13.232 27.86-29.413 13.973 13.991 29.456-26.769 12.717 16.81 35.374 35.601-16.915 40.375-110.808zm15.239-129.364c13.685 4.869 20.824 19.908 15.954 33.593-4.87 13.685-19.908 20.833-33.593 15.963-13.685-4.87-20.834-19.917-15.963-33.602 4.87-13.685 19.917-20.825 33.602-15.954z\"/></svg>',\n)}`;\n\nexport type PasskeyWalletOptions = PasskeyConnectorOptions;\n\nexport const passkeyWallet = (opts: PasskeyWalletOptions) => (): Wallet => ({\n id: \"passkey\",\n name: \"Passkey\",\n iconUrl,\n iconBackground: \"#fec\",\n createConnector: (walletDetails) => (config) => ({\n ...passkeyConnector(opts)(config),\n ...walletDetails,\n }),\n});\n","import { Account } from \"viem\";\nimport { ToCoinbaseSmartAccountReturnType } from \"./toCoinbaseSmartAccount\";\n\nexport function isCoinbaseSmartAccount(account: Account | undefined): account is ToCoinbaseSmartAccountReturnType {\n return account != null && \"__isCoinbaseSmartAccount\" in account && account.__isCoinbaseSmartAccount === true;\n}\n","import { Hash, Hex, RpcTransactionReceipt, RpcUserOperationReceipt, Transport } from \"viem\";\n\nexport const wiresawChainIds = new Set([17420, 31337]);\n\nexport function wiresaw<const transport extends Transport>(originalTransport: transport): transport {\n return ((opts) => {\n const { request: originalRequest, ...rest } = originalTransport(opts);\n\n let chainId: Hex | null = null;\n const receipts = new Map<Hash, RpcTransactionReceipt | RpcUserOperationReceipt>();\n\n return {\n ...rest,\n async request(req) {\n // console.log(\"wiresaw: got rpc call\", req.method, JSON.stringify(req.params ?? []));\n\n if (req.method === \"eth_chainId\") {\n if (chainId != null) return chainId;\n return (chainId = await originalRequest(req));\n }\n\n // if (req.method === \"eth_estimateGas\") {\n // return originalRequest({ ...req, method: \"wiresaw_estimateGas\" });\n // }\n\n // if (req.method === \"eth_sendRawTransaction\") {\n // const receipt = (await originalRequest({\n // ...req,\n // method: \"wiresaw_sendRawTransaction\",\n // // TODO: type `request` so we don't have to cast\n // })) as RpcTransactionReceipt;\n // // TODO: wiresaw should return an appropriate error here\n // if (receipt == null) {\n // throw new Error(\"Failed to include transaction.\");\n // }\n // receipts.set(receipt[\"transactionHash\"], receipt);\n // return receipt[\"transactionHash\"];\n // }\n\n if (req.method === \"eth_getTransactionReceipt\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hash = (req.params as any)[0] as Hash;\n const receipt = receipts.get(hash) ?? ((await originalRequest(req)) as RpcTransactionReceipt);\n if (!receipts.has(hash)) receipts.set(hash, receipt);\n return receipt;\n }\n\n if (req.method === \"eth_sendUserOperation\") {\n // TODO: type `request` so we don't have to cast\n const result = (await originalRequest({\n ...req,\n method: \"wiresaw_sendUserOperation\",\n })) as { txHash: Hex; userOpHash: Hex };\n // :haroldsmile:\n receipts.set(result.userOpHash, {\n success: true,\n userOpHash: result.userOpHash,\n receipt: { transactionHash: result.txHash },\n } as RpcUserOperationReceipt);\n return result.userOpHash;\n }\n\n if (req.method === \"eth_getUserOperationReceipt\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hash = (req.params as any)[0] as Hash;\n const receipt = receipts.get(hash) ?? ((await originalRequest(req)) as RpcUserOperationReceipt);\n if (!receipts.has(hash)) receipts.set(hash, receipt);\n return receipt;\n }\n\n return originalRequest(req);\n },\n };\n }) as transport;\n}\n","import { EntryKitConfig } from \"./config\";\nimport { WalletList, connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { getWallets } from \"./getWallets\";\nimport { CreateConnectorFn } from \"wagmi\";\n\nexport function getConnectors({\n wallets,\n ...config\n}: EntryKitConfig & { readonly wallets?: WalletList }): CreateConnectorFn[] {\n return connectorsForWallets(wallets ?? getWallets(config), {\n appName: config.appInfo?.name ?? document.title,\n projectId: config.walletConnectProjectId,\n });\n}\n","import { EntryKitConfig } from \"./config\";\nimport { WalletList, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\n\nexport function getWallets(config: EntryKitConfig): WalletList {\n const { wallets: defaultWallets } = getDefaultWallets();\n return [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n bundlerTransport: config.bundlerTransport,\n paymasterAddress: config.paymasterAddress,\n }),\n ],\n },\n ...defaultWallets,\n ];\n}\n"],"mappings":"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","names":["DialogRoot","DialogPortal","DialogContent","forwardRef","useEffect","useRef","useState","ReactDOM","useResizeObserver","mergeRefs","createContext","useContext","jsx","Context","FrameProvider","frame","children","useMediaQuery","createContext","useContext","RainbowKitProvider","lightTheme","midnightTheme","jsx","Context","EntryKitConfigProvider","config","children","useEntryKitConfig","useTheme","initialTheme","useEntryKitConfig","darkMode","useMediaQuery","jsx","jsxs","Resizer","onSize","props","ref","useRef","useResizeObserver","Shadow","forwardRef","mode","children","forwardedRef","frameRef","loaded","setLoaded","useState","frame","frameSize","setFrameSize","frameDocument","theme","useTheme","useEffect","frameStyle","mergeRefs","ReactDOM","FrameProvider","tailwind_default","twMerge","jsx","jsxs","Modal","open","onOpenChange","children","DialogRoot","DialogPortal","Shadow","DialogContent","event","useCallback","useMemo","useStore","createStore","store","useAccountModal","accountModalOpen","state","openAccountModal","closeAccountModal","toggleAccountModal","open","twMerge","useConnectorClient","useAccount","twMerge","twMerge","jsx","jsxs","PendingIcon","className","props","jsx","jsxs","buttonClassName","variant","twMerge","Button","pending","type","className","children","disabled","props","PendingIcon","useConnectModal","useMutation","useConnectors","createClient","custom","getAddress","numberToHex","SwitchChainError","ChainNotConfiguredError","createConnector","createStore","persist","cache","listener","event","smartAccountActions","toWebAuthnAccount","BaseError","pad","encodeFunctionData","hashMessage","hashTypedData","encodeAbiParameters","stringToHex","size","encodePacked","parseSignature","entryPoint07Abi","entryPoint07Address","getUserOperationHash","toSmartAccount","readContract","parseP256Signature","toCoinbaseSmartAccount","parameters","client","owners","nonce","address","entryPoint","factory","factoryAbi","accountToBytes","account","owner","ownerIndex","abi","calls","call","factoryData","wrapSignature","hash","toReplaySafeHash","signature","sign","message","domain","types","primaryType","chainId","userOperation","webauthn","toWebAuthnSignature","r","s","signatureData","getAccount","client","id","publicKeys","cache","publicKey","owners","toWebAuthnAccount","toCoinbaseSmartAccount","bytesToHex","hashMessage","sign","bytesToHex","hexToBytes","concatBytes","utf8ToBytes","getMessageHash","webauthn","authenticatorData","challengeIndexRaw","clientDataJSON","typeIndexRaw","userVerificationRequired","typeIndex","challengeIndex","authenticatorDataBytes","flag","type","clientDataJSONHash","messageHash","sign","parseSignature","serializePublicKey","secp256r1","getCandidatePublicKeys","input","r","s","candidate1","candidate2","hashMessage","findPublicKey","input1","input2","firstDuplicate","getCandidatePublicKeys","recoverPasskeyPublicKey","input","message2","signature2","webauthn2","credential","sign","messageHash2","getMessageHash","publicKey","arr","seen","s","reusePasskey","randomChallenge","bytesToHex","messageHash","hashMessage","signature","webauthn","credential","sign","publicKey","cache","webauthnHash","getMessageHash","passkey","recoverPasskeyPublicKey","state","createCredential","createPasskey","credential","createCredential","cache","state","resourceToHex","parseAbi","worldConfig","defaultClientConfig","unlimitedDelegationControlId","worldTables","worldAbi","viem_createBundlerClient","knownChainFees","createBundlerClient","paymasterAddress","config","chain","viem_createBundlerClient","defaultClientConfig","observer","passkeyConnector","chainId","bundlerTransport","paymasterAddress","explorerUrl","createConnector","config","chain","transport","client","createClient","defaultClientConfig","connected","cache","id","createPasskey","account","getAccount","numberToHex","reusePasskey","params","accounts","c","SwitchChainError","ChainNotConfiguredError","a","getAddress","_connectInfo","_error","credentialId","createBundlerClient","smartAccountActions","_params","custom","usePasskeyConnector","connector","useConnectors","c","passkeyConnector","twMerge","jsx","jsxs","Logo","className","props","useAppInfo","appInfo","useEntryKitConfig","appName","appOrigin","appIcon","appImage","useQuery","usePreloadImage","url","resolve","reject","image","jsx","jsxs","AppInfo","appName","appIcon","useAppInfo","hasAppIcon","appIconLoading","usePreloadImage","Logo","twMerge","jsx","jsxs","ConnectWallet","userAccount","useAccount","accountModalOpen","useAccountModal","openConnectModal","connectModalOpen","useConnectModal","passkeyConnector","usePasskeyConnector","createPasskey","useMutation","error","reusePasskey","hasPasskey","buttons","Button","AppInfo","useState","useMemo","parseEther","minGasBalance","useReadContract","IStoreReadAbi","decodeValueArgs","getKeyTuple","getSchemaTypes","getValueSchema","useRecord","table","key","opts","data","defineStore","parseAbi","paymasterAbi","paymasterConfig","paymasterTables","useAllowance","user","chainId","paymasterAddress","useEntryKitConfig","useRecord","paymasterTables","useClient","useQuery","createStore","persist","store","appSigners","listener","event","generatePrivateKey","privateKeyToAccount","getAppSigner","userAddress","appSignerPrivateKey","store","privateKey","state","smartAccountActions","callFrom","observer","getAppAccountClient","worldAddress","userAddress","client","bundlerTransport","paymasterAddress","explorerUrl","appSigner","getAppSigner","account","toCoinbaseSmartAccount","createBundlerClient","smartAccountActions","callFrom","useAppAccountClient","userAddress","chainId","bundlerTransport","paymasterAddress","worldAddress","explorerUrl","useEntryKitConfig","client","useClient","queryKey","useQuery","getAppAccountClient","useClient","decodeValueArgs","getKeyTuple","getSchemaTypes","getValueSchema","readContract","getAction","getRecord","client","address","table","key","blockTag","staticData","encodedLengths","dynamicData","abi","useQuery","getSpenderQueryKey","client","paymasterAddress","userAddress","appAccountAddress","useSpender","chainId","useEntryKitConfig","useClient","queryKey","getRecord","paymasterTables","useClient","useQuery","getDelegationQueryKey","client","worldAddress","userAddress","appAccountAddress","useDelegation","chainId","useEntryKitConfig","useClient","queryKey","useQuery","getRecord","worldTables","unlimitedDelegationControlId","useDisconnect","useQuery","useENS","address","normalizedAddress","data","res","jsx","jsxs","TruncatedHex","hex","jsx","jsxs","Wallet","isActive","isExpanded","userAddress","ens","useENS","disconnect","disconnectIsPending","useDisconnect","closeAccountModal","useAccountModal","TruncatedHex","Button","useMutation","useQueryClient","useClaimGasPass","queryClient","passIssuerTransport","useEntryKitConfig","error","userAddress","transport","twMerge","jsx","jsxs","EthIcon","className","props","formatEther","formatBalance","wei","formatted","magnitude","jsx","jsxs","Balance","wei","formatBalance","EthIcon","useEffect","jsx","jsxs","Allowance","isActive","isExpanded","userAddress","allowance","useAllowance","claimGasPass","useClaimGasPass","useEffect","minGasBalance","Balance","PendingIcon","Button","useMutation","useQueryClient","getAction","sendUserOperation","waitForUserOperationReceipt","writeContract","useSetupAppAccount","worldAddress","paymasterAddress","useEntryKitConfig","queryClient","useQueryClient","useMutation","error","userClient","appAccountAddress","registerSpender","registerDelegation","getAction","writeContract","paymasterAbi","worldAbi","unlimitedDelegationControlId","calls","hash","sendUserOperation","receipt","waitForUserOperationReceipt","queryKey","getSpenderQueryKey","getDelegationQueryKey","jsx","jsxs","Session","isActive","isExpanded","userClient","registerSpender","registerDelegation","closeAccountModal","useAccountModal","appAccountClient","useAppAccountClient","setup","useSetupAppAccount","isReady","Button","jsx","useSteps","userClient","userAddress","allowance","useAllowance","appAccountClient","useAppAccountClient","isSpender","useSpender","hasDelegation","useDelegation","useMemo","props","Wallet","minGasBalance","Allowance","Session","twMerge","jsx","ConnectedSteps","userClient","steps","useSteps","selectedStepId","useState","nextStep","step","completedSteps","activeStep","activeStepIndex","i","isActive","isExpanded","isDisabled","jsx","AccountModalContent","chainId","useEntryKitConfig","userClient","useConnectorClient","ConnectWallet","ConnectedSteps","useState","ErrorBoundary","twMerge","BaseError","UserRejectedRequestError","jsx","jsxs","ErrorNotice","initialTitle","error","e","title","message","wait","twMerge","useIsMounted","jsx","jsxs","AccountModalErrorBoundary","children","isMounted","useIsMounted","retries","setRetries","useState","ErrorBoundary","error","resetErrorBoundary","twMerge","ErrorNotice","event","wait","value","PendingIcon","DialogClose","DialogTitle","twMerge","jsx","IconSVG","className","children","props","jsx","CloseIcon","props","IconSVG","jsx","jsxs","AccountModal","accountModalOpen","toggleAccountModal","useAccountModal","Modal","DialogTitle","twMerge","AccountModalErrorBoundary","AccountModalContent","Logo","DialogClose","CloseIcon","jsx","jsxs","EntryKitProvider","config","children","EntryKitConfigProvider","AccountModal","useAccount","twMerge","twMerge","Fragment","jsx","jsxs","AccountName","address","ens","useENS","hasAvatar","usePreloadImage","Logo","TruncatedHex","useMemo","useConnectorClient","usePreparedAppAccountClient","chainId","useEntryKitConfig","userClient","userClientError","useConnectorClient","appAccountClient","useAppAccountClient","steps","useSteps","useMemo","step","jsx","jsxs","containerClassNames","twMerge","secondaryClassNames","secondaryInteractiveClassNames","AccountButton","openAccountModal","accountModalOpen","useAccountModal","status","address","useAccount","usePreparedAppAccountClient","Shadow","AccountName","Logo","PendingIcon","connectorsForWallets","getDefaultWallets","createConfig","iconUrl","passkeyWallet","opts","walletDetails","config","passkeyConnector","createWagmiConfig","config","defaultWallets","getDefaultWallets","wallets","passkeyWallet","connectors","connectorsForWallets","createConfig","isCoinbaseSmartAccount","account","wiresawChainIds","wiresaw","originalTransport","opts","originalRequest","rest","chainId","receipts","req","hash","receipt","result","connectorsForWallets","getDefaultWallets","getWallets","config","defaultWallets","getDefaultWallets","passkeyWallet","getConnectors","wallets","config","connectorsForWallets","getWallets"]}
1
+ {"version":3,"sources":["../../src/ui/Modal.tsx","../../src/ui/Shadow.tsx","../../src/ui/FrameProvider.tsx","../../src/useTheme.ts","../../src/EntryKitConfigProvider.tsx","../../src/useAccountModal.ts","../../src/AccountModal.tsx","../../src/AccountModalContent.tsx","../../src/ConnectWallet.tsx","../../src/ui/Button.tsx","../../src/icons/PendingIcon.tsx","../../src/usePasskeyConnector.ts","../../src/passkey/passkeyConnector.ts","../../src/passkey/cache.ts","../../src/passkey/getAccount.ts","../../src/smart-account/toCoinbaseSmartAccount.ts","../../src/passkey/reusePasskey.ts","../../src/passkey/getMessageHash.ts","../../src/passkey/recoverPasskeyPublicKey.ts","../../src/passkey/getCandidatePublicKeys.ts","../../src/passkey/createPasskey.ts","../../src/common.ts","../../src/createBundlerClient.ts","../../src/icons/Logo.tsx","../../src/useAppInfo.ts","../../src/usePreloadImage.tsx","../../src/AppInfo.tsx","../../src/onboarding/ConnectedSteps.tsx","../../src/onboarding/useSteps.tsx","../../src/onboarding/common.ts","../../src/useRecord.ts","../../src/paymaster.ts","../../src/onboarding/useAllowance.ts","../../src/useAppAccountClient.ts","../../src/onboarding/store.ts","../../src/getAppSigner.ts","../../src/getAppAccountClient.ts","../../src/onboarding/useSpender.ts","../../src/utils/getRecord.ts","../../src/onboarding/useDelegation.ts","../../src/onboarding/Wallet.tsx","../../src/useENS.ts","../../src/ui/TruncatedHex.tsx","../../src/onboarding/useClaimGasPass.ts","../../src/icons/EthIcon.tsx","../../src/formatBalance.ts","../../src/ui/Balance.tsx","../../src/onboarding/Allowance.tsx","../../src/onboarding/useSetupAppAccount.ts","../../src/onboarding/Session.tsx","../../src/AccountModalErrorBoundary.tsx","../../src/ErrorNotice.tsx","../../src/icons/IconSVG.tsx","../../src/icons/CloseIcon.tsx","../../src/EntryKitProvider.tsx","../../src/AccountButton.tsx","../../src/AccountName.tsx","../../src/usePreparedAppAccountClient.ts","../../src/createWagmiConfig.ts","../../src/passkey/passkeyWallet.ts","../../src/smart-account/isCoinbaseSmartAccount.ts","../../src/wiresaw.ts","../../src/getConnectors.ts","../../src/getWallets.ts"],"sourcesContent":["import { ReactNode } from \"react\";\nimport { Root as DialogRoot, DialogPortal, DialogContent } from \"@radix-ui/react-dialog\";\nimport { Shadow } from \"./Shadow\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n};\n\nexport function Modal({ open, onOpenChange, children }: Props) {\n return (\n <DialogRoot open={open} onOpenChange={onOpenChange}>\n {/* This intentionally does not use `<DialogTrigger>` because it doesn't play nicely with `<Shadow>` trigger (our primary use case). */}\n <DialogPortal>\n <Shadow mode=\"modal\">\n {/**\n * This intentionally does not use `<DialogOverlay>` due to an issue it causes with scrolling the modal contents.\n * See https://github.com/radix-ui/primitives/issues/1159#issuecomment-1105320294\n */}\n <div className={twMerge(\"fixed inset-0\", \"bg-neutral-800/85\", \"animate-in animate-duration-300 fade-in\")} />\n <div\n className={twMerge(\n \"fixed inset-0\",\n \"grid items-end sm:items-center\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-16\",\n )}\n >\n <div>\n <DialogContent\n className=\"outline-none w-full max-w-[26rem] mx-auto\"\n // TODO description\n aria-describedby={undefined}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n {children}\n </DialogContent>\n </div>\n </div>\n </Shadow>\n </DialogPortal>\n </DialogRoot>\n );\n}\n","import { CSSProperties, HTMLProps, ReactNode, forwardRef, useEffect, useRef, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport css from \"tailwindcss/tailwind.css?inline\";\nimport { useResizeObserver } from \"usehooks-ts\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { FrameProvider } from \"./FrameProvider\";\nimport { useTheme } from \"../useTheme\";\n\nexport type Props = {\n mode: \"modal\" | \"child\";\n children: ReactNode;\n};\n\nfunction Resizer({\n onSize,\n ...props\n}: {\n onSize: (size: { width: number | undefined; height: number | undefined }) => void;\n} & HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement | null>(null);\n useResizeObserver({ ref, onResize: onSize });\n return <div ref={ref} {...props} style={{ ...props.style, display: \"inline-grid\" }} />;\n}\n\n// TODO: make a container inside the iframe that is at least the size of the window, render content into that so we can correctly measure size relative to window\n// otherwise as the iframe shrinks, the measurement will be based on that shrunk value and it'll never get bigger, only smaller\n\nexport const Shadow = forwardRef<HTMLIFrameElement, Props>(function Shadow({ mode, children }, forwardedRef) {\n const frameRef = useRef<HTMLIFrameElement | null>(null);\n const [loaded, setLoaded] = useState(false);\n const frame = loaded ? frameRef.current : null;\n\n const [frameSize, setFrameSize] = useState<{ width: number | undefined; height: number | undefined }>({\n width: undefined,\n height: undefined,\n });\n\n const frameDocument = frame?.contentDocument;\n const theme = useTheme();\n useEffect(() => {\n if (frameDocument) {\n frameDocument.body.setAttribute(\"data-theme\", theme);\n }\n }, [frameDocument, theme]);\n\n const frameStyle: CSSProperties =\n mode === \"modal\"\n ? {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n zIndex: \"2147483646\",\n }\n : frameSize.width && frameSize.height\n ? {\n all: \"unset\",\n display: \"inline-grid\",\n width: `${frameSize.width}px`,\n height: `${frameSize.height}px`,\n }\n : {\n all: \"unset\",\n display: \"block\",\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n opacity: 0,\n pointerEvents: \"none\",\n };\n\n return (\n <iframe\n ref={mergeRefs([forwardedRef, frameRef])}\n style={frameStyle}\n onLoad={() => setLoaded(true)}\n srcDoc=\"<!doctype html><title>…</title>\"\n >\n {frameDocument\n ? ReactDOM.createPortal(\n <FrameProvider frame={frame}>\n {/*\n * TODO: make this the size of the outer window so that any container-based resizing in iframe\n * is done from that rather than the potentially-small size of this iframe\n */}\n <div>{mode === \"modal\" ? children : <Resizer onSize={setFrameSize}>{children}</Resizer>}</div>\n <style dangerouslySetInnerHTML={{ __html: css }} />\n </FrameProvider>,\n frameDocument.body,\n )\n : null}\n </iframe>\n );\n});\n","import { createContext, useContext, type ReactNode } from \"react\";\n\ntype ContextValue = {\n readonly frame: HTMLIFrameElement;\n};\n\n/** @internal */\nconst Context = createContext<ContextValue | null>(null);\n\nexport type Props = {\n frame: HTMLIFrameElement;\n children?: ReactNode;\n};\n\nexport function FrameProvider({ frame, children }: Props) {\n const value = useContext(Context);\n if (value) throw new Error(\"`FrameProvider` can only be used once.\");\n return <Context.Provider value={{ frame }}>{children}</Context.Provider>;\n}\n\nexport function useFrame(): ContextValue {\n const value = useContext(Context);\n if (!value) throw new Error(\"`useFrame` can only be used within a `FrameProvider`.\");\n return value;\n}\n","import { useMediaQuery } from \"usehooks-ts\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useTheme() {\n const { theme: initialTheme } = useEntryKitConfig();\n const darkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\n const theme = initialTheme ?? (darkMode ? \"dark\" : \"light\");\n return theme;\n}\n","import \"@rainbow-me/rainbowkit/styles.css\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { RainbowKitProvider, lightTheme, midnightTheme } from \"@rainbow-me/rainbowkit\";\nimport { EntryKitConfig } from \"./config\";\n\n/** @internal */\nconst Context = createContext<EntryKitConfig | null>(null);\n\nexport type Props = {\n config: EntryKitConfig;\n children?: ReactNode;\n};\n\nexport function EntryKitConfigProvider({ config, children }: Props) {\n const currentConfig = useContext(Context);\n if (currentConfig) throw new Error(\"`EntryKitProvider` can only be used once.\");\n\n return (\n <RainbowKitProvider\n initialChain={config.chainId}\n appInfo={{\n appName: config.appInfo?.name,\n // TODO: learn more and disclaimer\n }}\n theme={\n config.theme === \"light\"\n ? lightTheme({ borderRadius: \"none\" })\n : config.theme === \"dark\"\n ? midnightTheme({ borderRadius: \"none\" })\n : {\n lightMode: lightTheme({ borderRadius: \"none\" }),\n darkMode: midnightTheme({ borderRadius: \"none\" }),\n }\n }\n >\n <Context.Provider value={config}>{children}</Context.Provider>\n </RainbowKitProvider>\n );\n}\n\nexport function useEntryKitConfig(): EntryKitConfig {\n const config = useContext(Context);\n if (!config) throw new Error(\"`useEntryKitConfig` can only be used within a `EntryKitProvider`.\");\n return config;\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useStore } from \"zustand\";\nimport { createStore } from \"zustand/vanilla\";\n\nconst store = createStore(() => ({ open: false }));\n\nexport type UseAccountModalResult = {\n readonly accountModalOpen: boolean;\n readonly openAccountModal: () => void;\n readonly closeAccountModal: () => void;\n readonly toggleAccountModal: (open: boolean) => void;\n};\n\nexport function useAccountModal(): UseAccountModalResult {\n const accountModalOpen = useStore(store, (state) => state.open);\n\n const openAccountModal = useCallback(() => {\n store.setState({ open: true });\n }, []);\n\n const closeAccountModal = useCallback(() => {\n store.setState({ open: false });\n }, []);\n\n const toggleAccountModal = useCallback((open: boolean) => {\n store.setState({ open: open });\n }, []);\n\n return useMemo(\n () => ({\n accountModalOpen,\n openAccountModal,\n closeAccountModal,\n toggleAccountModal,\n }),\n [accountModalOpen, openAccountModal, closeAccountModal, toggleAccountModal],\n );\n}\n","import { Modal } from \"./ui/Modal\";\nimport { useAccountModal } from \"./useAccountModal\";\nimport { twMerge } from \"tailwind-merge\";\nimport { AccountModalContent } from \"./AccountModalContent\";\nimport { AccountModalErrorBoundary } from \"./AccountModalErrorBoundary\";\nimport { DialogClose, DialogTitle } from \"@radix-ui/react-dialog\";\nimport { CloseIcon } from \"./icons/CloseIcon\";\nimport { Logo } from \"./icons/Logo\";\n\nexport function AccountModal() {\n const { accountModalOpen, toggleAccountModal } = useAccountModal();\n return (\n <Modal open={accountModalOpen} onOpenChange={toggleAccountModal}>\n {/* TODO: move this into `<Modal>` props? */}\n <DialogTitle className=\"sr-only\">Connect with EntryKit</DialogTitle>\n {accountModalOpen ? (\n <div\n className={twMerge(\n \"relative py-2 ring-1\",\n \"bg-neutral-900 text-neutral-400 ring-neutral-700/50 divide-neutral-700\",\n \"links:font-medium links:underline links:underline-offset-4\",\n \"links:text-white\",\n \"links:decoration-neutral-500 hover:links:decoration-orange-500\",\n )}\n >\n <AccountModalErrorBoundary>\n <AccountModalContent />\n </AccountModalErrorBoundary>\n\n <a\n href=\"https://mud.dev\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"group self-center p-3 flex items-center justify-center gap-2 links-unset text-sm font-mono transition text-neutral-400 hover:text-white\"\n >\n <span className=\"block w-4 h-4\">\n <Logo className=\"w-full h-full text-orange-500 group-hover:rotate-90 transition duration-300\" />\n </span>\n <span>Powered by MUD</span>\n </a>\n\n <div className=\"absolute top-0 right-0\">\n <DialogClose\n className={twMerge(\n \"pointer-events-auto leading-none p-2 transition\",\n \"text-neutral-700 hover:text-neutral-500\",\n )}\n title=\"Close\"\n >\n <CloseIcon className=\"m-0\" />\n </DialogClose>\n </div>\n </div>\n ) : null}\n </Modal>\n );\n}\n","import { useConnectorClient } from \"wagmi\";\nimport { ConnectWallet } from \"./ConnectWallet\";\nimport { ConnectedSteps } from \"./onboarding/ConnectedSteps\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function AccountModalContent() {\n const { chainId } = useEntryKitConfig();\n const userClient = useConnectorClient({ chainId });\n\n if (userClient.status !== \"success\") {\n return <ConnectWallet />;\n }\n\n return <ConnectedSteps userClient={userClient.data} />;\n}\n","import { useAccount } from \"wagmi\";\nimport { Button } from \"./ui/Button\";\nimport { useAccountModal } from \"./useAccountModal\";\nimport { useConnectModal } from \"@rainbow-me/rainbowkit\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { usePasskeyConnector } from \"./usePasskeyConnector\";\nimport { AppInfo } from \"./AppInfo\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function ConnectWallet() {\n const userAccount = useAccount();\n const { accountModalOpen } = useAccountModal();\n const { openConnectModal, connectModalOpen } = useConnectModal();\n\n // TODO: show error states\n\n const passkeyConnector = usePasskeyConnector();\n const createPasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"createPasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.createPasskey(),\n });\n const reusePasskey = useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"reusePasskey\", passkeyConnector.id, accountModalOpen, connectModalOpen, userAccount.status],\n mutationFn: () => passkeyConnector.reusePasskey(),\n });\n\n const hasPasskey = passkeyConnector.hasPasskey();\n\n const buttons = [\n <Button\n key=\"create\"\n variant={hasPasskey ? \"secondary\" : \"primary\"}\n className=\"self-auto flex justify-center\"\n pending={createPasskey.status === \"pending\"}\n onClick={() => createPasskey.mutate()}\n autoFocus={!hasPasskey}\n >\n Create account\n </Button>,\n <Button\n key=\"signin\"\n variant={hasPasskey ? \"primary\" : \"secondary\"}\n className=\"self-auto flex justify-center\"\n pending={reusePasskey.status === \"pending\"}\n onClick={() => reusePasskey.mutate()}\n autoFocus={hasPasskey}\n >\n Sign in\n </Button>,\n ];\n\n if (hasPasskey) {\n buttons.reverse();\n }\n\n return (\n <div\n className={twMerge(\"flex flex-col gap-6 p-6\", \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\")}\n >\n <div className=\"p-4\">\n {/* TODO: render appImage if available? */}\n <AppInfo />\n </div>\n <div className=\"self-center flex flex-col gap-2 w-60\">\n {buttons}\n <button\n className=\"text-sm self-center transition text-neutral-500 hover:text-white p-2\"\n disabled={userAccount.status === \"connecting\"}\n // TODO: figure out how to prevent this from switching chains after connecting\n onClick={openConnectModal}\n >\n Already have a wallet?\n </button>\n </div>\n </div>\n );\n}\n","/* eslint-disable max-len */\nimport { ButtonHTMLAttributes, DetailedHTMLProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\n\n// TODO: add support for async onClick, where pending is enabled automatically\n// TODO: add error state with popover/tooltip\n\ntype ButtonClassNameOptions = {\n variant?: \"primary\" | \"secondary\";\n pending?: boolean;\n};\n\nconst buttonClassName = ({ variant = \"primary\" }: ButtonClassNameOptions = {}) =>\n twMerge(\n \"group 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-neutral-700 text-white\"),\n secondary: twMerge(\"bg-neutral-800 text-white\"),\n }[variant],\n );\n\nexport type ButtonProps = {\n pending?: boolean;\n variant?: ButtonClassNameOptions[\"variant\"];\n};\n\nexport type Props = ButtonProps & DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;\n\nexport const Button = ({ pending, variant, type, className, children, disabled, ...props }: Props) => {\n return (\n <button\n type={type || \"button\"}\n className={twMerge(buttonClassName({ variant, pending }), className)}\n aria-busy={pending}\n aria-disabled={disabled}\n disabled={disabled || pending}\n {...props}\n >\n <span className=\"grid grid-cols-[1fr_auto_1fr] gap-2\">\n <span className=\"flex items-center justify-end text-[.75em]\">\n <span className=\"transition opacity-0 translate-x-2 group-aria-busy:opacity-100 group-aria-busy:translate-x-0 duration-100 group-aria-busy:duration-300\">\n <PendingIcon />\n </span>\n </span>\n <span>{children}</span>\n </span>\n </button>\n );\n};\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function PendingIcon({ className, ...props }: Props) {\n return (\n <svg\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em] animate-spin\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n","import { useConnectors } from \"wagmi\";\nimport { PasskeyConnector, passkeyConnector } from \"./passkey/passkeyConnector\";\n\nexport function usePasskeyConnector(): PasskeyConnector {\n const connectors = useConnectors();\n const connector = connectors.find((c) => c.type === passkeyConnector.type);\n if (!connector) {\n // TODO: provide link to instructions\n throw new Error(\n \"Could not find passkey connector. Did you configure Wagmi with the EntryKit passkey connector or passkey wallet?\",\n );\n }\n return connector as never;\n}\n","import {\n createClient,\n custom,\n EIP1193RequestFn,\n EIP1474Methods,\n getAddress,\n numberToHex,\n SwitchChainError,\n Client,\n ProviderConnectInfo,\n Transport,\n Address,\n} from \"viem\";\nimport { ChainNotConfiguredError, createConnector, CreateConnectorFn } from \"wagmi\";\nimport { cache } from \"./cache\";\nimport { smartAccountActions } from \"permissionless/clients\";\nimport { getAccount } from \"./getAccount\";\nimport { reusePasskey } from \"./reusePasskey\";\nimport { createPasskey } from \"./createPasskey\";\nimport { defaultClientConfig } from \"../common\";\nimport { createBundlerClient } from \"../createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\n\nexport type PasskeyConnectorOptions = {\n // TODO: figure out what we wanna do across chains\n chainId: number;\n bundlerTransport: Transport;\n paymasterAddress: Address;\n explorerUrl?: string;\n};\n\nexport type PasskeyProvider = {\n request: EIP1193RequestFn<EIP1474Methods>;\n};\nexport type PasskeyConnectorProperties = {\n createPasskey(): Promise<void>;\n reusePasskey(): Promise<void>;\n // TODO: does wagmi storage require this to be async?\n hasPasskey(): boolean;\n getClient(parameters?: { chainId?: number | undefined } | undefined): Promise<Client>;\n onConnect(connectInfo: ProviderConnectInfo): void;\n};\n\nexport type CreatePasskeyConnector = CreateConnectorFn<PasskeyProvider, PasskeyConnectorProperties, {}>;\nexport type PasskeyConnector = ReturnType<CreatePasskeyConnector>;\n\npasskeyConnector.type = \"passkey\" as const;\n\nexport function passkeyConnector({\n chainId,\n bundlerTransport,\n paymasterAddress,\n explorerUrl,\n}: PasskeyConnectorOptions): CreatePasskeyConnector {\n return createConnector((config) => {\n // TODO: figure out how to use with config's `client` option\n if (!config.transports) {\n throw new Error(`Wagmi must be configured with transports to use the passkey connector.`);\n }\n\n const chain = config.chains.find((c) => c.id === chainId);\n if (!chain) throw new Error(`Could not find configured chain for chain ID ${chainId}.`);\n\n const transport = config.transports[chain.id];\n if (!transport) {\n throw new Error(`Could not find configured transport for chain ID ${chainId}.`);\n }\n const client = createClient({ ...defaultClientConfig, chain, transport });\n\n let connected = cache.getState().activeCredential != null;\n\n return {\n id: \"passkey\",\n type: passkeyConnector.type,\n name: \"Passkey\",\n // TODO: check that this works\n // supportsSimulation: true,\n\n async createPasskey() {\n const { id } = await createPasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n async reusePasskey() {\n const { id } = await reusePasskey();\n const account = await getAccount(client, id);\n this.onAccountsChanged([account.address]);\n this.onConnect?.({ chainId: numberToHex(chainId) });\n },\n hasPasskey() {\n return Object.keys(cache.getState().publicKeys).length > 0;\n },\n\n async connect(params) {\n console.log(\"connect\");\n // TODO: allow any chain?\n if (params?.chainId != null && params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n // attempt to reuse credential if this is called directly\n // TODO: move this into wallet so it's only triggered via rainbowkit?\n if (!cache.getState().activeCredential && !params?.isReconnecting) {\n await reusePasskey();\n }\n\n const accounts = await this.getAccounts();\n connected = accounts.length > 0;\n\n return { accounts, chainId };\n },\n async disconnect() {\n console.log(\"disconnect\");\n connected = false;\n cache.setState({ activeCredential: null });\n },\n async getAccounts() {\n console.log(\"getAccounts\");\n const id = cache.getState().activeCredential;\n if (!id) return [];\n\n try {\n console.log(\"getting account for credential\", id);\n const account = await getAccount(client, id);\n console.log(\"got account\", account);\n return [account.address];\n } catch (error) {\n console.log(\"could not get address for credential ID\", id);\n }\n\n return [];\n },\n async getChainId() {\n return chainId;\n },\n async isAuthorized() {\n console.log(\"isAuthorized\");\n if (!connected) return false;\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n },\n async switchChain(params) {\n // TODO: allow any chain?\n if (params.chainId !== chainId) {\n throw new Error(`Can't connect to chain ${params.chainId}. Passkey connector is bound to chain ${chainId}.`);\n }\n\n const chain = config.chains.find((c) => c.id === params.chainId);\n if (!chain) throw new SwitchChainError(new ChainNotConfiguredError());\n return chain;\n },\n onAccountsChanged(accounts) {\n console.log(\"onAccountsChanged\");\n if (accounts.length > 0) {\n config.emitter.emit(\"change\", {\n accounts: accounts.map((a) => getAddress(a)),\n });\n } else {\n this.onDisconnect();\n }\n },\n onChainChanged(chainId) {\n console.log(\"onChainChanged\");\n config.emitter.emit(\"change\", { chainId: Number(chainId) });\n },\n async onConnect(_connectInfo) {\n console.log(\"onConnect\");\n const accounts = await this.getAccounts();\n config.emitter.emit(\"connect\", { accounts, chainId });\n },\n async onDisconnect(_error) {\n console.log(\"onDisconnect\");\n config.emitter.emit(\"disconnect\");\n connected = false;\n },\n\n // By default, connector clients are bound to a `json-rpc` account.\n // We provide our own `getClient` method here so that we can return\n // a `smart` account, which is necessary for using with Viem's\n // account abstraction actions (i.e. user ops).\n //\n // Although Wagmi recommends connectors be tree-shakable, we return\n // an extended client here so that this client works with native\n // Wagmi hooks. Otherwise the app needs to build its own client, then\n // wrap each call in its own react-query hooks.\n async getClient(params) {\n console.log(\"passkeyConnector.getClient\", params);\n\n const credentialId = cache.getState().activeCredential;\n if (!credentialId) throw new Error(\"Not connected.\");\n\n const account = await getAccount(client, credentialId);\n\n return createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account,\n })\n .extend(smartAccountActions())\n .extend((client) => (explorerUrl ? observer({ explorerUrl })(client) : {}));\n },\n\n async getProvider(_params) {\n // TODO: chain specific provider?\n // TODO: is turning off retryCount important? is wrapping in this way enough to turn off retries?\n return custom({ request: client.transport.request })({ retryCount: 0 });\n },\n };\n });\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { P256Credential } from \"viem/account-abstraction\";\nimport { Address } from \"viem\";\n\n// TODO: move this to wagmi storage?\n// when I tried, it blew up TS complexity and my IDE was impossible to work with\n\nexport type State = {\n readonly publicKeys: {\n readonly [key in P256Credential[\"id\"]]?: P256Credential[\"publicKey\"];\n };\n readonly addresses: {\n readonly [key in P256Credential[\"id\"]]?: Address;\n };\n readonly activeCredential: P256Credential[\"id\"] | null;\n};\n\nexport const cache = createStore(\n persist<State>(\n () => ({\n publicKeys: {},\n addresses: {},\n activeCredential: null,\n }),\n { name: \"mud:passkey:cache\" },\n ),\n);\n\n// keep cache in sync across tabs/windows via storage event\nfunction listener(event: StorageEvent) {\n if (event.key === cache.persist.getOptions().name) {\n cache.persist.rehydrate();\n }\n}\nwindow.addEventListener(\"storage\", listener);\n","import { Client } from \"viem\";\nimport { toWebAuthnAccount } from \"viem/account-abstraction\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"webauthn-p256\";\nimport { toCoinbaseSmartAccount, ToCoinbaseSmartAccountReturnType } from \"../smart-account/toCoinbaseSmartAccount\";\n\nexport async function getAccount(client: Client, id: P256Credential[\"id\"]): Promise<ToCoinbaseSmartAccountReturnType> {\n const { publicKeys } = cache.getState();\n\n const publicKey = publicKeys[id];\n // TODO: should we prompt to recover key here?\n if (!publicKey) {\n throw new Error(\"No public key found for passkey credential.\");\n }\n\n const passkey = toWebAuthnAccount({ credential: { id, publicKey } });\n const owners = [passkey];\n\n return await toCoinbaseSmartAccount({ client, owners });\n}\n","// Forked from https://github.com/wevm/viem/blob/main/src/account-abstraction/accounts/implementations/toCoinbaseSmartAccount.ts\n// to match our forked contracts (upgrade to v0.7 entrypoint)\nimport { BaseError, type Address, type TypedData } from \"abitype\";\nimport {\n Client,\n OneOf,\n LocalAccount,\n Prettify,\n Assign,\n pad,\n encodeFunctionData,\n hashMessage,\n TypedDataDefinition,\n hashTypedData,\n Hash,\n encodeAbiParameters,\n stringToHex,\n size,\n encodePacked,\n parseSignature,\n} from \"viem\";\nimport {\n WebAuthnAccount,\n SmartAccount,\n SmartAccountImplementation,\n entryPoint07Abi,\n entryPoint07Address,\n getUserOperationHash,\n UserOperation,\n toSmartAccount,\n} from \"viem/account-abstraction\";\nimport { readContract } from \"viem/actions\";\nimport { type WebAuthnData, parseSignature as parseP256Signature, Hex } from \"webauthn-p256\";\n\nexport type ToCoinbaseSmartAccountParameters = {\n address?: Address | undefined;\n client: Client;\n owners: readonly OneOf<LocalAccount | WebAuthnAccount>[];\n nonce?: bigint | undefined;\n signer?: OneOf<LocalAccount | WebAuthnAccount>;\n};\n\nexport type ToCoinbaseSmartAccountReturnType = Prettify<SmartAccount<CoinbaseSmartAccountImplementation>>;\n\nexport type CoinbaseSmartAccountImplementation = Assign<\n SmartAccountImplementation<\n typeof entryPoint07Abi,\n \"0.7\",\n {\n __isCoinbaseSmartAccount: true;\n abi: typeof abi;\n factory: { abi: typeof factoryAbi; address: Address };\n signer: OneOf<LocalAccount | WebAuthnAccount>;\n }\n >,\n {\n sign: NonNullable<SmartAccountImplementation[\"sign\"]>;\n // TODO: should this be inside `extend` of `SmartAccountImplementation`?\n isOwner: (account: LocalAccount | WebAuthnAccount) => Promise<boolean>;\n }\n>;\n\n/**\n * @description Create a Coinbase Smart Account.\n *\n * @param parameters - {@link ToCoinbaseSmartAccountParameters}\n * @returns Coinbase Smart Account. {@link ToCoinbaseSmartAccountReturnType}\n *\n * @example\n * import { toCoinbaseSmartAccount } from 'viem/account-abstraction'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { client } from './client.js'\n *\n * const account = toCoinbaseSmartAccount({\n * client,\n * owners: [privateKeyToAccount('0x...')],\n * })\n */\nexport async function toCoinbaseSmartAccount(\n parameters: ToCoinbaseSmartAccountParameters,\n): Promise<ToCoinbaseSmartAccountReturnType> {\n const { client, owners, nonce = 0n } = parameters;\n\n let address = parameters.address;\n\n const entryPoint = {\n abi: entryPoint07Abi,\n address: entryPoint07Address,\n version: \"0.7\",\n } as const;\n const factory = {\n abi: factoryAbi,\n // TODO: make configurable?\n address: \"0x356336adA1619BeC1Ae4E6D94Dd9c0490DA414a8\",\n } as const;\n\n if (!owners.length) {\n throw new Error(\"`owners` must have at least one account.\");\n }\n\n function accountToBytes(account: LocalAccount | WebAuthnAccount) {\n return account.type === \"webAuthn\" ? account.publicKey : pad(account.address);\n }\n\n const owner = parameters.signer ?? owners[0];\n const ownerIndex = owners.indexOf(owner);\n if (ownerIndex === -1) {\n throw new Error(\"`signer` must be one of `owners`.\");\n }\n\n return toSmartAccount({\n client,\n entryPoint,\n\n extend: {\n __isCoinbaseSmartAccount: true as const,\n abi,\n factory,\n signer: owner,\n },\n\n async encodeCalls(calls) {\n if (calls.length === 1)\n return encodeFunctionData({\n abi,\n functionName: \"execute\",\n args: [calls[0].to, calls[0].value ?? 0n, calls[0].data ?? \"0x\"],\n });\n return encodeFunctionData({\n abi,\n functionName: \"executeBatch\",\n args: [\n calls.map((call) => ({\n data: call.data ?? \"0x\",\n target: call.to,\n value: call.value ?? 0n,\n })),\n ],\n });\n },\n\n async getAddress() {\n address ??= await readContract(client, {\n ...factory,\n functionName: \"getAddress\",\n args: [owners.map(accountToBytes), nonce],\n });\n return address;\n },\n\n async getFactoryArgs() {\n const factoryData = encodeFunctionData({\n abi: factory.abi,\n functionName: \"createAccount\",\n args: [owners.map(accountToBytes), nonce],\n });\n return { factory: factory.address, factoryData };\n },\n\n async getStubSignature() {\n if (owner.type === \"webAuthn\")\n // eslint-disable-next-line max-len\n return \"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000\";\n return wrapSignature({\n signature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n ownerIndex,\n });\n },\n\n async sign(parameters) {\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: parameters.hash,\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signMessage(parameters) {\n const { message } = parameters;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashMessage(message),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signTypedData(parameters) {\n const { domain, types, primaryType, message } = parameters as TypedDataDefinition<TypedData, string>;\n const address = await this.getAddress();\n\n const hash = toReplaySafeHash({\n address,\n chainId: client.chain!.id,\n hash: hashTypedData({\n domain,\n message,\n primaryType,\n types,\n }),\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n async signUserOperation(parameters) {\n const { chainId = client.chain!.id, ...userOperation } = parameters;\n\n const address = await this.getAddress();\n const hash = getUserOperationHash({\n chainId,\n entryPointAddress: entryPoint.address,\n entryPointVersion: entryPoint.version,\n userOperation: {\n ...(userOperation as unknown as UserOperation),\n sender: address,\n },\n });\n\n const signature = await sign({ hash, owner });\n\n return wrapSignature({ signature, ownerIndex });\n },\n\n userOperation: {\n async estimateGas(userOperation) {\n if (owner.type !== \"webAuthn\") return;\n\n // Accounts with WebAuthn owner require a minimum verification gas limit of 800,000.\n return {\n verificationGasLimit: BigInt(Math.max(Number(userOperation.verificationGasLimit ?? 0n), 800_000)),\n };\n },\n },\n\n async isOwner(account: LocalAccount | WebAuthnAccount) {\n return await readContract(client, {\n abi,\n address: await this.getAddress(),\n functionName: \"isOwnerBytes\",\n args: [accountToBytes(account)],\n });\n },\n });\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Utilities\n/////////////////////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport async function sign({ hash, owner }: { hash: Hash; owner: OneOf<LocalAccount | WebAuthnAccount> }) {\n // WebAuthn Account (Passkey)\n if (owner.type === \"webAuthn\") {\n const { signature, webauthn } = await owner.sign({\n hash,\n });\n return toWebAuthnSignature({ signature, webauthn });\n }\n\n if (owner.sign) return owner.sign({ hash });\n\n throw new BaseError(\"`owner` does not support raw sign.\");\n}\n\n/** @internal */\nexport function toReplaySafeHash({ address, chainId, hash }: { address: Address; chainId: number; hash: Hash }) {\n return hashTypedData({\n domain: {\n chainId,\n name: \"Coinbase Smart Wallet\",\n verifyingContract: address,\n version: \"1\",\n },\n types: {\n CoinbaseSmartWalletMessage: [\n {\n name: \"hash\",\n type: \"bytes32\",\n },\n ],\n },\n primaryType: \"CoinbaseSmartWalletMessage\",\n message: {\n hash,\n },\n });\n}\n\n/** @internal */\nexport function toWebAuthnSignature({ webauthn, signature }: { webauthn: WebAuthnData; signature: Hex }) {\n const { r, s } = parseP256Signature(signature);\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"authenticatorData\",\n type: \"bytes\",\n },\n { name: \"clientDataJSON\", type: \"bytes\" },\n { name: \"challengeIndex\", type: \"uint256\" },\n { name: \"typeIndex\", type: \"uint256\" },\n {\n name: \"r\",\n type: \"uint256\",\n },\n {\n name: \"s\",\n type: \"uint256\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n authenticatorData: webauthn.authenticatorData,\n clientDataJSON: stringToHex(webauthn.clientDataJSON),\n challengeIndex: BigInt(webauthn.challengeIndex),\n typeIndex: BigInt(webauthn.typeIndex),\n r,\n s,\n },\n ],\n );\n}\n\n/** @internal */\nexport function wrapSignature(parameters: { ownerIndex: number; signature: Hex }) {\n const { ownerIndex } = parameters;\n const signatureData = (() => {\n if (size(parameters.signature) !== 65) return parameters.signature;\n const signature = parseSignature(parameters.signature);\n return encodePacked([\"bytes32\", \"bytes32\", \"uint8\"], [signature.r, signature.s, signature.yParity === 0 ? 27 : 28]);\n })();\n return encodeAbiParameters(\n [\n {\n components: [\n {\n name: \"ownerIndex\",\n type: \"uint8\",\n },\n {\n name: \"signatureData\",\n type: \"bytes\",\n },\n ],\n type: \"tuple\",\n },\n ],\n [\n {\n ownerIndex,\n signatureData,\n },\n ],\n );\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////\n// Constants\n/////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const abi = [\n { inputs: [], stateMutability: \"nonpayable\", type: \"constructor\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"AlreadyOwner\",\n type: \"error\",\n },\n { inputs: [], name: \"Initialized\", type: \"error\" },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidEthereumAddressOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"key\", type: \"uint256\" }],\n name: \"InvalidNonceKey\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"owner\", type: \"bytes\" }],\n name: \"InvalidOwnerBytesLength\",\n type: \"error\",\n },\n { inputs: [], name: \"LastOwner\", type: \"error\" },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"NoOwnerAtIndex\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"ownersRemaining\", type: \"uint256\" }],\n name: \"NotLastOwner\",\n type: \"error\",\n },\n {\n inputs: [{ name: \"selector\", type: \"bytes4\" }],\n name: \"SelectorNotAllowed\",\n type: \"error\",\n },\n { inputs: [], name: \"Unauthorized\", type: \"error\" },\n { inputs: [], name: \"UnauthorizedCallContext\", type: \"error\" },\n { inputs: [], name: \"UpgradeFailed\", type: \"error\" },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"expectedOwner\", type: \"bytes\" },\n { name: \"actualOwner\", type: \"bytes\" },\n ],\n name: \"WrongOwnerAtIndex\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"AddOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"index\",\n type: \"uint256\",\n },\n { indexed: false, name: \"owner\", type: \"bytes\" },\n ],\n name: \"RemoveOwner\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n\n name: \"implementation\",\n type: \"address\",\n },\n ],\n name: \"Upgraded\",\n type: \"event\",\n },\n { stateMutability: \"payable\", type: \"fallback\" },\n {\n inputs: [],\n name: \"REPLAYABLE_NONCE_KEY\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owner\", type: \"address\" }],\n name: \"addOwnerAddress\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"addOwnerPublicKey\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"functionSelector\", type: \"bytes4\" }],\n name: \"canSkipChainIdValidation\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"domainSeparator\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"eip712Domain\",\n outputs: [\n { name: \"fields\", type: \"bytes1\" },\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"extensions\", type: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"entryPoint\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"execute\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"executeBatch\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"calls\", type: \"bytes[]\" }],\n name: \"executeWithoutChainIdValidation\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n ],\n name: \"getUserOpHashWithoutChainId\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"$\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owners\", type: \"bytes[]\" }],\n name: \"initialize\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"isOwnerAddress\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"bytes\" }],\n name: \"isOwnerBytes\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"x\", type: \"bytes32\" },\n { name: \"y\", type: \"bytes32\" },\n ],\n name: \"isOwnerPublicKey\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"hash\", type: \"bytes32\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"isValidSignature\",\n outputs: [{ name: \"result\", type: \"bytes4\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextOwnerIndex\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"index\", type: \"uint256\" }],\n name: \"ownerAtIndex\",\n outputs: [{ name: \"\", type: \"bytes\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ownerCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"proxiableUUID\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeLastOwner\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"index\", type: \"uint256\" },\n { name: \"owner\", type: \"bytes\" },\n ],\n name: \"removeOwnerAtIndex\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"removedOwnersCount\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"hash\", type: \"bytes32\" }],\n name: \"replaySafeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"newImplementation\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"upgradeToAndCall\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"sender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"initCode\", type: \"bytes\" },\n { name: \"callData\", type: \"bytes\" },\n { name: \"callGasLimit\", type: \"uint256\" },\n {\n name: \"verificationGasLimit\",\n type: \"uint256\",\n },\n {\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n { name: \"maxFeePerGas\", type: \"uint256\" },\n {\n name: \"maxPriorityFeePerGas\",\n type: \"uint256\",\n },\n { name: \"paymasterAndData\", type: \"bytes\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n\n name: \"userOp\",\n type: \"tuple\",\n },\n { name: \"userOpHash\", type: \"bytes32\" },\n { name: \"missingAccountFunds\", type: \"uint256\" },\n ],\n name: \"validateUserOp\",\n outputs: [{ name: \"validationData\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n { stateMutability: \"payable\", type: \"receive\" },\n] as const;\n\nconst factoryAbi = [\n {\n inputs: [{ name: \"implementation_\", type: \"address\" }],\n stateMutability: \"payable\",\n type: \"constructor\",\n },\n { inputs: [], name: \"OwnerRequired\", type: \"error\" },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"createAccount\",\n outputs: [\n {\n name: \"account\",\n type: \"address\",\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"owners\", type: \"bytes[]\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n name: \"getAddress\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"implementation\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"initCodeHash\",\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { bytesToHex, hashMessage } from \"viem\";\nimport { sign } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { recoverPasskeyPublicKey } from \"./recoverPasskeyPublicKey\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function reusePasskey(): Promise<P256Credential> {\n const randomChallenge = bytesToHex(crypto.getRandomValues(new Uint8Array(256)));\n const messageHash = hashMessage(randomChallenge);\n const { signature, webauthn, raw: credential } = await sign({ hash: messageHash });\n\n const publicKey = await (async () => {\n const publicKey = cache.getState().publicKeys[credential.id];\n if (publicKey) return publicKey;\n\n // TODO: look up account/public key by credential ID once we store it onchain\n\n const webauthnHash = await getMessageHash(webauthn);\n const passkey = await recoverPasskeyPublicKey({\n credentialId: credential.id,\n messageHash: webauthnHash,\n signatureHex: signature,\n });\n if (!passkey) {\n throw new Error(\"recovery failed\");\n }\n if (passkey.credential.id !== credential.id) {\n throw new Error(\"wrong credential\");\n }\n\n cache.setState((state) => ({\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: passkey.publicKey,\n },\n }));\n\n return passkey.publicKey;\n })();\n\n console.log(\"recovered passkey\", credential.id, publicKey);\n\n cache.setState(() => ({\n activeCredential: credential.id,\n }));\n\n return { id: credential.id, publicKey, raw: credential };\n}\n","import { bytesToHex, Hex, hexToBytes, WebAuthnData } from \"webauthn-p256\";\nimport { concatBytes, utf8ToBytes } from \"@noble/curves/abstract/utils\";\n\n// lifted out of https://github.com/wevm/webauthn-p256/blob/main/src/verify.ts\n// TODO: submit a PR to lift this out as a function that can be exported\n\nexport async function getMessageHash(\n webauthn: Omit<WebAuthnData, \"typeIndex\" | \"challengeIndex\"> & {\n challengeIndex?: number;\n typeIndex?: number;\n },\n): Promise<Hex | never> {\n const {\n authenticatorData,\n challengeIndex: challengeIndexRaw,\n clientDataJSON,\n typeIndex: typeIndexRaw,\n userVerificationRequired,\n } = webauthn;\n\n const typeIndex = typeIndexRaw || clientDataJSON.indexOf('\"type\"');\n const challengeIndex = challengeIndexRaw || clientDataJSON.indexOf('\"challenge\"');\n\n const authenticatorDataBytes = hexToBytes(authenticatorData);\n\n // Check length of `authenticatorData`.\n if (authenticatorDataBytes.length < 37) throw new Error(\"Invalid authenticatorData\");\n\n const flag = authenticatorDataBytes[32]!;\n\n // Verify that the UP bit of the flags in authData is set.\n if ((flag & 0x01) !== 0x01) throw new Error(\"Invalid authenticatorData\");\n\n // If user verification was determined to be required, verify that\n // the UV bit of the flags in authData is set. Otherwise, ignore the\n // value of the UV flag.\n if (userVerificationRequired && (flag & 0x04) !== 0x04) throw new Error(\"Invalid authenticatorData\");\n\n // If the BE bit of the flags in authData is not set, verify that\n // the BS bit is not set.\n if ((flag & 0x08) !== 0x08 && (flag & 0x10) === 0x10) throw new Error(\"Invalid authenticatorData\");\n\n // Check that response is for an authentication assertion\n const type = '\"type\":\"webauthn.get\"';\n if (type !== clientDataJSON.slice(Number(typeIndex), type.length + 1)) throw new Error(\"Invalid clientDataJSON\");\n\n // Check that hash is in the clientDataJSON.\n const match = clientDataJSON.slice(Number(challengeIndex)).match(/^\"challenge\":\"(.*?)\"/);\n if (!match) throw new Error(\"Invalid clientDataJSON\");\n\n const clientDataJSONHash = new Uint8Array(await crypto.subtle.digest(\"SHA-256\", utf8ToBytes(clientDataJSON)));\n const messageHash = new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", concatBytes(hexToBytes(authenticatorData), clientDataJSONHash)),\n );\n\n return bytesToHex(messageHash);\n}\n","import { sign } from \"webauthn-p256\";\nimport { getMessageHash } from \"./getMessageHash\";\nimport { getCandidatePublicKeys } from \"./getCandidatePublicKeys\";\nimport { SignatureAndMessage } from \"./common\";\nimport { hashMessage, Hex } from \"viem\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport function findPublicKey([input1, input2]: [SignatureAndMessage, SignatureAndMessage]): Hex | undefined {\n // Return the candidate public key that appears twice\n return firstDuplicate([...getCandidatePublicKeys(input1), ...getCandidatePublicKeys(input2)]);\n}\n\nexport async function recoverPasskeyPublicKey(input: { credentialId: P256Credential[\"id\"] } & SignatureAndMessage) {\n const message2 = hashMessage(input.signatureHex);\n const {\n signature: signature2,\n webauthn: webauthn2,\n raw: credential,\n } = await sign({ credentialId: input.credentialId, hash: message2 });\n const messageHash2 = await getMessageHash(webauthn2);\n\n const publicKey = findPublicKey([input, { signatureHex: signature2, messageHash: messageHash2 }]);\n if (publicKey) {\n return { publicKey, credential };\n }\n}\n\nfunction firstDuplicate<T>(arr: T[]): T | undefined {\n const seen = new Set<T>();\n for (const s of arr) {\n if (seen.has(s)) {\n return s;\n }\n seen.add(s);\n }\n return undefined;\n}\n","import { parseSignature, serializePublicKey } from \"webauthn-p256\";\nimport { SignatureAndMessage } from \"./common\";\nimport { secp256r1 } from \"@noble/curves/p256\";\n\nexport function getCandidatePublicKeys(input: SignatureAndMessage) {\n const { r, s } = parseSignature(input.signatureHex);\n\n const candidate1 = new secp256r1.Signature(r, s).addRecoveryBit(1).recoverPublicKey(input.messageHash.slice(2));\n const candidate2 = new secp256r1.Signature(r, s).addRecoveryBit(0).recoverPublicKey(input.messageHash.slice(2));\n\n return [serializePublicKey(candidate1), serializePublicKey(candidate2)];\n}\n","import { createCredential } from \"webauthn-p256\";\nimport { cache } from \"./cache\";\nimport { P256Credential } from \"viem/account-abstraction\";\n\nexport async function createPasskey(): Promise<P256Credential> {\n const credential = await createCredential({ name: \"MUD Account\" });\n console.log(\"created passkey\", credential);\n\n cache.setState((state) => ({\n activeCredential: credential.id,\n publicKeys: {\n ...state.publicKeys,\n [credential.id]: credential.publicKey,\n },\n }));\n\n return credential;\n}\n","import { resourceToHex } from \"@latticexyz/common\";\nimport { Client, Chain, Transport, Account, parseAbi, ClientConfig, Address } from \"viem\";\nimport worldConfig from \"@latticexyz/world/mud.config\";\n\nexport type ConnectedClient<chain extends Chain = Chain> = Client<Transport, chain, Account>;\nexport type AppAccountClient<chain extends Chain = Chain> = ConnectedClient<chain> & { readonly userAddress: Address };\n\nexport const defaultClientConfig = {\n pollingInterval: 250,\n} as const satisfies Pick<ClientConfig, \"pollingInterval\">;\n\nexport const unlimitedDelegationControlId = resourceToHex({ type: \"system\", namespace: \"\", name: \"unlimited\" });\n\nexport const worldTables = worldConfig.namespaces.world.tables;\n\nexport const worldAbi = parseAbi([\n \"function registerDelegation(address delegatee, bytes32 delegationControlId, bytes initCallData)\",\n]);\n","import { Transport, Chain, Client, RpcSchema, Address } from \"viem\";\nimport {\n BundlerClient,\n BundlerClientConfig,\n SmartAccount,\n createBundlerClient as viem_createBundlerClient,\n} from \"viem/account-abstraction\";\nimport { defaultClientConfig } from \"./common\";\n\nconst knownChainFees = new Set([\n // anvil hardcodes fee returned by `eth_maxPriorityFeePerGas`\n // so we have to override it here\n // https://github.com/foundry-rs/foundry/pull/8081#issuecomment-2402002485\n 31337,\n // rhodolite\n 17420,\n // garnet\n 17069,\n // redstone\n 690,\n]);\n\nexport function createBundlerClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n account extends SmartAccount | undefined = undefined,\n client extends Client | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>({\n paymasterAddress,\n ...config\n}: BundlerClientConfig<transport, chain, account, client, rpcSchema> & { paymasterAddress: Address }): BundlerClient<\n transport,\n chain,\n account,\n client,\n rpcSchema\n> {\n const chain = config.chain ?? config.client?.chain;\n return viem_createBundlerClient({\n ...defaultClientConfig,\n paymaster: {\n getPaymasterData: async () => ({\n // TODO: source this from the chain config instead\n paymaster: paymasterAddress,\n paymasterData: \"0x\",\n }),\n },\n userOperation: {\n estimateFeesPerGas:\n // TODO: source this from the chain config instead\n chain && knownChainFees.has(chain.id)\n ? async () => ({\n maxFeePerGas: 100_000n,\n maxPriorityFeePerGas: 0n,\n })\n : undefined,\n },\n ...config,\n });\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function Logo({ className, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n fill=\"currentColor\"\n shapeRendering=\"crispEdges\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {/* eslint-disable-next-line max-len */}\n <path d=\"M0 0h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm2-1h1v1H7zm0 1h1v1H7zM6 7h1v1H6zm1-2h1v1H7zm0-1h1v1H7zm0-1h1v1H7z\" />\n <path\n d=\"M2 2h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm1-3h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm0 1h1v1H5zm0 1h1v1H5zm0 1h1v1H5zM4 5h1v1H4zM3 5h1v1H3z\"\n opacity=\".5\"\n />\n <path d=\"M7 2h1v1H7zm0-1h1v1H7zM1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm1 0h1v1H6zm1 0h1v1H7z\" />\n </svg>\n );\n}\n","import { useEntryKitConfig } from \"./EntryKitConfigProvider\";\n\nexport function useAppInfo() {\n const { appInfo } = useEntryKitConfig();\n\n const appName = appInfo?.name ?? document.title;\n // TODO: should origin be set in config and validated against current host?\n const appOrigin = location.host;\n const appIcon = appInfo?.icon ?? document.querySelector(\"link[rel~='icon']\")?.getAttribute(\"href\") ?? \"/favico.ico\";\n const appImage = appInfo?.image;\n\n return { appName, appOrigin, appIcon, appImage };\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nexport function usePreloadImage(url: string | undefined) {\n return useQuery({\n enabled: !!url,\n retry: false,\n retryOnMount: false,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n queryKey: [url],\n queryFn: () =>\n new Promise<InstanceType<typeof Image>>((resolve, reject) => {\n if (!url) throw new Error(\"usePreloadImage: Must provide `url` to preload image.\");\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`usePreloadImage: Could not load image.\\n\\n\\tURL: ${url}`));\n image.src = url;\n }),\n });\n}\n","import { Logo } from \"./icons/Logo\";\nimport { useAppInfo } from \"./useAppInfo\";\nimport { usePreloadImage } from \"./usePreloadImage\";\n\nexport function AppInfo() {\n const { appName, appIcon } = useAppInfo();\n\n const { data: hasAppIcon, isLoading: appIconLoading } = usePreloadImage(appIcon);\n\n return (\n <div className=\"flex-grow flex flex-col items-center justify-center gap-2\">\n <div className=\"w-16 h-16 m-2\">\n {!appIconLoading ? (\n hasAppIcon ? (\n <img src={appIcon} className=\"w-full h-full object-cover\" />\n ) : (\n // TODO: swap with favicon\n <Logo className=\"w-full h-full text-orange-500 dark:bg-neutral-800\" />\n )\n ) : null}\n </div>\n <div className=\"text-2xl text-white text-center\">{appName}</div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { useSteps } from \"./useSteps\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n userClient: ConnectedClient;\n};\n\nexport function ConnectedSteps({ userClient }: Props) {\n const steps = useSteps(userClient);\n\n // TODO: detect if just connected and, if so, dismiss\n\n const [selectedStepId] = useState<null | string>(null);\n const nextStep = steps.find((step) => step.content != null && !step.isComplete);\n const completedSteps = steps.filter((step) => step.isComplete);\n const activeStep =\n (selectedStepId != null ? steps.find((step) => step.id === selectedStepId) : null) ??\n nextStep ??\n (completedSteps.length < steps.length ? completedSteps.at(-1) : null);\n const activeStepIndex = activeStep ? steps.indexOf(activeStep) : -1;\n\n return (\n <div\n className={twMerge(\n \"min-h-[26rem] px-8 flex flex-col divide-y divide-neutral-800\",\n \"animate-in animate-duration-300 fade-in slide-in-from-bottom-8\",\n )}\n >\n {steps.map((step, i) => {\n const isActive = step === activeStep;\n const isExpanded = isActive || completedSteps.length === steps.length;\n const isDisabled = !step.isComplete && activeStepIndex !== -1 && i > activeStepIndex;\n return (\n <div key={step.id} className={twMerge(\"py-8 flex flex-col justify-center\", isActive ? \"flex-grow\" : null)}>\n <div className={twMerge(\"flex flex-col\", isDisabled ? \"opacity-30 pointer-events-none\" : null)}>\n {step.content({ isActive, isExpanded })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { ConnectedClient } from \"../common\";\nimport { Step, minGasBalance } from \"./common\";\nimport { useAllowance } from \"./useAllowance\";\nimport { useAppAccountClient } from \"../useAppAccountClient\";\nimport { useSpender } from \"./useSpender\";\nimport { useDelegation } from \"./useDelegation\";\nimport { Wallet } from \"./Wallet\";\nimport { Allowance } from \"./Allowance\";\nimport { Session } from \"./Session\";\n\nexport function useSteps(userClient: ConnectedClient | undefined): readonly Step[] {\n const userAddress = userClient?.account.address;\n const allowance = useAllowance(userAddress);\n const appAccountClient = useAppAccountClient(userAddress);\n\n const spender = useSpender(userAddress, appAccountClient.data?.account.address);\n const isSpender = spender.data === true;\n\n const delegation = useDelegation(userAddress, appAccountClient.data?.account.address);\n const hasDelegation = delegation.data === true;\n\n return useMemo(() => {\n if (!userAddress) {\n return [\n {\n id: \"wallet\",\n label: \"Sign in\",\n isComplete: false,\n content: () => null,\n },\n ];\n }\n\n return [\n {\n id: \"wallet\",\n label: \"Sign in\",\n isComplete: true,\n content: (props) => <Wallet {...props} userAddress={userAddress} />,\n },\n {\n id: \"allowance\",\n label: \"Top up\",\n isComplete: (allowance.data?.allowance ?? 0n) >= minGasBalance,\n content: (props) => <Allowance {...props} userAddress={userAddress} />,\n },\n {\n id: \"session\",\n label: \"Set up account\",\n isComplete: isSpender && hasDelegation,\n content: (props) => (\n <Session\n {...props}\n userClient={userClient}\n registerSpender={!isSpender}\n registerDelegation={!hasDelegation}\n />\n ),\n },\n ];\n }, [allowance.data?.allowance, hasDelegation, isSpender, userAddress, userClient]);\n}\n","import { ReactNode } from \"react\";\nimport { parseEther } from \"viem\";\n\nexport type Step = {\n id: string;\n label: string;\n isComplete: boolean;\n content: (props: { isActive: boolean; isExpanded: boolean }) => ReactNode;\n};\n\nexport const minGasBalance = parseEther(\"0.01\");\n","import { Table } from \"@latticexyz/config\";\nimport { UseReadContractParameters, UseReadContractReturnType, useReadContract } from \"wagmi\";\nimport IStoreReadAbi from \"@latticexyz/store/out/IStoreRead.sol/IStoreRead.abi.json\";\nimport {\n decodeValueArgs,\n getKeySchema,\n getKeyTuple,\n getSchemaPrimitives,\n getSchemaTypes,\n getValueSchema,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { Hex } from \"viem\";\nimport { show } from \"@ark/util\";\n\n// TODO: move to our own useQuery so we can control the query key\n\nexport function useRecord<table extends Table>({\n table,\n key,\n ...opts\n}: Omit<\n UseReadContractParameters<typeof IStoreReadAbi, \"getRecord\", [Hex, readonly Hex[]]>,\n \"abi\" | \"functionName\" | \"args\"\n> & {\n readonly table?: table;\n readonly key?: getSchemaPrimitives<getKeySchema<table>>;\n}): UseReadContractReturnType<\n typeof IStoreReadAbi,\n \"getRecord\",\n readonly [Hex, readonly Hex[]],\n show<getSchemaPrimitives<table[\"schema\"]>>\n> {\n return useReadContract(\n table && key && opts.query?.enabled !== false\n ? {\n ...opts,\n abi: IStoreReadAbi,\n functionName: \"getRecord\",\n args: [table.tableId, getKeyTuple(table, key)],\n query: {\n ...opts.query,\n select: (data) => ({\n ...key,\n ...decodeValueArgs(getSchemaTypes(getValueSchema(table)), {\n staticData: (data as [Hex, Hex, Hex])[0],\n encodedLengths: (data as [Hex, Hex, Hex])[1],\n dynamicData: (data as [Hex, Hex, Hex])[2],\n }),\n }),\n },\n }\n : {},\n );\n}\n","import { defineStore } from \"@latticexyz/store\";\nimport { parseAbi } from \"viem\";\n\n// TODO: whole ABI\nexport const paymasterAbi = parseAbi([\n \"error SpenderSystem_AlreadyRegistered(address spender, address user)\",\n \"error SpenderSystem_HasOwnBalance(address spender)\",\n \"function registerSpender(address spender)\",\n]);\n\nexport const paymasterConfig = defineStore({\n namespaces: {\n root: {\n namespace: \"\",\n tables: {\n Allowance: {\n schema: {\n user: \"address\",\n allowance: \"uint256\",\n },\n key: [\"user\"],\n },\n Grantor: {\n schema: {\n grantor: \"address\",\n allowance: \"uint256\",\n },\n key: [\"grantor\"],\n },\n PassHolder: {\n schema: {\n user: \"address\",\n passId: \"bytes32\",\n lastRenewed: \"uint256\",\n lastClaimed: \"uint256\",\n },\n key: [\"user\", \"passId\"],\n },\n PassConfig: {\n schema: {\n passId: \"bytes32\",\n claimAmount: \"uint256\",\n claimInterval: \"uint256\",\n validityPeriod: \"uint256\",\n grantor: \"address\",\n },\n key: [\"passId\"],\n },\n Spender: {\n schema: {\n spender: \"address\",\n user: \"address\",\n },\n key: [\"spender\"],\n },\n SystemConfig: {\n schema: {\n entryPoint: \"address\",\n },\n key: [],\n },\n },\n },\n },\n});\n\nexport const paymasterTables = paymasterConfig.namespaces.root.tables;\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useRecord } from \"../useRecord\";\nimport { paymasterTables } from \"../paymaster\";\n\nexport function useAllowance(user: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n\n return useRecord({\n chainId,\n address: paymasterAddress,\n ...(user\n ? {\n table: paymasterTables.Allowance,\n key: { user },\n }\n : null),\n });\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { UseQueryResult, useQuery } from \"@tanstack/react-query\";\nimport { getAppAccountClient } from \"./getAppAccountClient\";\nimport { AppAccountClient } from \"./common\";\n\nexport function useAppAccountClient(userAddress: Address | undefined): UseQueryResult<AppAccountClient> {\n const { chainId, bundlerTransport, paymasterAddress, worldAddress, explorerUrl } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const queryKey = [\"appAccountClient\", client?.uid, userAddress];\n return useQuery(\n client && userAddress\n ? {\n queryKey,\n queryFn: async () => {\n return await getAppAccountClient({\n worldAddress,\n userAddress,\n client,\n bundlerTransport,\n paymasterAddress,\n explorerUrl,\n });\n },\n staleTime: Infinity,\n }\n : { queryKey, enabled: false },\n );\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist } from \"zustand/middleware\";\nimport { Address, Hex } from \"viem\";\n\nexport type State = {\n readonly appSigners: {\n readonly [key in Address]?: Hex;\n };\n};\n\nexport const store = createStore(\n persist<State>(\n () => ({\n appSigners: {},\n }),\n {\n name: \"mud:entrykit\",\n partialize: ({ appSigners }) => ({ appSigners }),\n },\n ),\n);\n\n// keep store in sync across tabs/windows via storage event\nfunction listener(event: StorageEvent) {\n if (event.key === store.persist.getOptions().name) {\n store.persist.rehydrate();\n }\n}\nwindow.addEventListener(\"storage\", listener);\n","import { Address } from \"viem\";\nimport { store } from \"./onboarding/store\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nexport function getAppSigner(userAddress: Address) {\n const appSignerPrivateKey =\n store.getState().appSigners[userAddress] ??\n (() => {\n const privateKey = generatePrivateKey();\n store.setState((state) => ({\n appSigners: {\n ...state.appSigners,\n [userAddress]: privateKey,\n },\n }));\n return privateKey;\n })();\n\n return privateKeyToAccount(appSignerPrivateKey);\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { getAppSigner } from \"./getAppSigner\";\nimport { toCoinbaseSmartAccount } from \"./smart-account/toCoinbaseSmartAccount\";\nimport { smartAccountActions } from \"permissionless\";\nimport { callFrom } from \"@latticexyz/world/internal\";\nimport { createBundlerClient } from \"./createBundlerClient\";\nimport { observer } from \"@latticexyz/explorer/observer\";\nimport { AppAccountClient } from \"./common\";\n\nexport async function getAppAccountClient<chain extends Chain>({\n worldAddress,\n userAddress,\n client,\n bundlerTransport,\n paymasterAddress,\n explorerUrl,\n}: {\n worldAddress: Address;\n userAddress: Address;\n client: Client<Transport, chain>;\n bundlerTransport: Transport;\n paymasterAddress: Address;\n explorerUrl?: string;\n}): Promise<AppAccountClient<chain>> {\n const appSigner = getAppSigner(userAddress);\n const account = await toCoinbaseSmartAccount({ client, owners: [appSigner] });\n\n const appAccountClient = createBundlerClient({\n paymasterAddress,\n transport: bundlerTransport,\n client,\n account,\n })\n .extend(smartAccountActions())\n .extend(callFrom({ worldAddress, delegatorAddress: userAddress, publicClient: client }))\n .extend((client) => (explorerUrl ? observer({ explorerUrl })(client) : {}))\n .extend(() => ({ userAddress }));\n\n return appAccountClient;\n}\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { paymasterTables } from \"../paymaster\";\nimport { useClient } from \"wagmi\";\nimport { getRecord } from \"../utils/getRecord\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nexport function getSpenderQueryKey({\n client,\n paymasterAddress,\n userAddress,\n appAccountAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n paymasterAddress: Address;\n userAddress: Address | undefined;\n appAccountAddress: Address | undefined;\n}) {\n return [\"spender\", client?.chain.id, paymasterAddress, userAddress, appAccountAddress];\n}\n\nexport function useSpender(userAddress: Address | undefined, appAccountAddress: Address | undefined) {\n const { chainId, paymasterAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const queryKey = getSpenderQueryKey({ client, paymasterAddress, userAddress, appAccountAddress });\n return useQuery(\n client && userAddress && appAccountAddress\n ? {\n queryKey,\n queryFn: async () => {\n const record = await getRecord(client, {\n address: paymasterAddress,\n table: paymasterTables.Spender,\n key: { spender: appAccountAddress },\n });\n return record.user.toLowerCase() === userAddress.toLowerCase();\n },\n }\n : { queryKey, enabled: false },\n );\n}\n","import { Address, Client, Hex } from \"viem\";\nimport { Table } from \"@latticexyz/config\";\nimport {\n decodeValueArgs,\n getKeySchema,\n getKeyTuple,\n getSchemaPrimitives,\n getSchemaTypes,\n getValueSchema,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { readContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\n// TODO: move this to store package or similar\n\nexport type GetRecordOptions<table extends Table> = {\n address: Address;\n table: table;\n key: getSchemaPrimitives<getKeySchema<table>>;\n blockTag?: \"latest\" | \"pending\";\n};\n\nexport async function getRecord<table extends Table>(\n client: Client,\n { address, table, key, blockTag }: GetRecordOptions<table>,\n): Promise<getSchemaPrimitives<table[\"schema\"]>> {\n const [staticData, encodedLengths, dynamicData] = await getAction(\n client,\n readContract,\n \"readContract\",\n )({\n address,\n abi,\n functionName: \"getRecord\",\n args: [table.tableId, getKeyTuple(table, key) as readonly Hex[]],\n blockTag,\n });\n\n return {\n ...key,\n ...decodeValueArgs(getSchemaTypes(getValueSchema(table)), { staticData, encodedLengths, dynamicData }),\n };\n}\n\nconst abi = [\n {\n type: \"function\",\n name: \"getRecord\",\n inputs: [\n {\n name: \"tableId\",\n type: \"bytes32\",\n internalType: \"ResourceId\",\n },\n {\n name: \"keyTuple\",\n type: \"bytes32[]\",\n internalType: \"bytes32[]\",\n },\n ],\n outputs: [\n {\n name: \"staticData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"encodedLengths\",\n type: \"bytes32\",\n internalType: \"EncodedLengths\",\n },\n {\n name: \"dynamicData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import { Address, Chain, Client, Transport } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useClient } from \"wagmi\";\nimport { getRecord } from \"../utils/getRecord\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { unlimitedDelegationControlId, worldTables } from \"../common\";\n\nexport function getDelegationQueryKey({\n client,\n worldAddress,\n userAddress,\n appAccountAddress,\n}: {\n client: Client<Transport, Chain> | undefined;\n worldAddress: Address;\n userAddress: Address | undefined;\n appAccountAddress: Address | undefined;\n}) {\n return [\"delegation\", client?.chain.id, worldAddress, userAddress, appAccountAddress];\n}\n\nexport function useDelegation(userAddress: Address | undefined, appAccountAddress: Address | undefined) {\n const { chainId, worldAddress } = useEntryKitConfig();\n const client = useClient({ chainId });\n\n const queryKey = getDelegationQueryKey({ client, worldAddress, userAddress, appAccountAddress });\n return useQuery(\n client && userAddress && appAccountAddress\n ? {\n queryKey,\n queryFn: async () => {\n const record = await getRecord(client, {\n address: worldAddress,\n table: worldTables.UserDelegationControl,\n key: { delegator: userAddress, delegatee: appAccountAddress },\n });\n return record.delegationControlId === unlimitedDelegationControlId;\n },\n }\n : { queryKey, enabled: false },\n );\n}\n","import { useDisconnect } from \"wagmi\";\nimport { useENS } from \"../useENS\";\nimport { TruncatedHex } from \"../ui/TruncatedHex\";\nimport { Button } from \"../ui/Button\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { Hex } from \"viem\";\n\nexport type Props = {\n isActive: boolean;\n isExpanded: boolean;\n userAddress: Hex;\n};\n\nexport function Wallet({ isActive, isExpanded, userAddress }: Props) {\n const { data: ens } = useENS(userAddress);\n const { disconnect, isPending: disconnectIsPending } = useDisconnect();\n const { closeAccountModal } = useAccountModal();\n\n // TODO: render ENS avatar if available?\n // TODO: display disconnect error as popover near button?\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Account</div>\n <div className=\"font-mono text-white\">{ens.name ?? <TruncatedHex hex={userAddress} />}</div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"secondary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\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 initialData: {\n address: undefined,\n name: undefined,\n displayName: undefined,\n avatar: undefined,\n },\n queryFn: async () => {\n // TODO: typed response\n const data = await fetch(`https://api.ensideas.com/ens/resolve/${normalizedAddress}`).then((res) => res.json());\n return {\n address: data.address ?? undefined,\n name: data.name ?? undefined,\n displayName: data.displayName ?? undefined,\n avatar: data.avatar ?? undefined,\n };\n },\n });\n}\n","import { Hex } from \"viem\";\n\nexport type Props = {\n hex: Hex;\n};\n\nexport function TruncatedHex({ hex }: Props) {\n if (hex.length <= 10) {\n return <span title={hex}>{hex}</span>;\n }\n\n return (\n <span title={hex}>\n <span className=\"after:select-none after:content-['…']\">{hex.slice(0, 6)}</span>\n <span className=\"tracking-[-1ch] text-transparent\">{hex.slice(6, -4)}</span>\n {hex.slice(-4)}\n </span>\n );\n}\n","import { Address } from \"viem\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport function useClaimGasPass() {\n const queryClient = useQueryClient();\n\n // TODO: add types for RPC methods\n // TODO: use client.request once this is behind proxyd\n const { passIssuerTransport } = useEntryKitConfig();\n return useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"claimGasPass\"],\n mutationFn: async (userAddress: Address) => {\n const transport = passIssuerTransport({ retryCount: 0 });\n await transport.request({\n method: \"quarry_issuePass\",\n params: [\"0x01\", userAddress],\n });\n await transport.request({\n method: \"quarry_claimAllowance\",\n params: [\"0x01\", userAddress],\n });\n\n await queryClient.invalidateQueries({ queryKey: [\"readContract\"] });\n },\n });\n}\n","import { DetailedHTMLProps, SVGAttributes } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;\n\nexport function EthIcon({ className, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 263 428\"\n fill=\"currentColor\"\n className={twMerge(\"w-[0.6em] h-[1em]\", className)}\n {...props}\n >\n <path d=\"M132 321V428L263 243L132 321Z\" />\n <path d=\"M0 243L132 321V428\" fillOpacity=\"0.5\" />\n <path d=\"M132 0V296L263 218\" />\n <path d=\"M0 218L132 296V0L0 218Z\" fillOpacity=\"0.5\" />\n </svg>\n );\n}\n","import { formatEther } from \"viem\";\n\nexport function formatBalance(wei: bigint) {\n // TODO: should this support non-ether decimals?\n const formatted = formatEther(wei);\n const magnitude = Math.floor(parseFloat(formatted)).toString().length;\n return parseFloat(formatted).toLocaleString(\"en-US\", { maximumFractionDigits: Math.max(0, 6 - magnitude) });\n}\n","import { EthIcon } from \"../icons/EthIcon\";\nimport { formatBalance } from \"../formatBalance\";\n\ntype Props = {\n wei: bigint;\n};\n\nexport function Balance({ wei }: Props) {\n return (\n <span className=\"inline-flex items-center gap-1\">\n {formatBalance(wei)} <EthIcon />\n </span>\n );\n}\n","import { Hex } from \"viem\";\nimport { useAllowance } from \"./useAllowance\";\nimport { PendingIcon } from \"../icons/PendingIcon\";\nimport { useClaimGasPass } from \"./useClaimGasPass\";\nimport { Button } from \"../ui/Button\";\nimport { Balance } from \"../ui/Balance\";\nimport { useEffect } from \"react\";\nimport { minGasBalance } from \"./common\";\n\nexport type Props = {\n isExpanded: boolean;\n isActive: boolean;\n userAddress: Hex;\n};\n\nexport function Allowance({ isActive, isExpanded, userAddress }: Props) {\n const allowance = useAllowance(userAddress);\n const claimGasPass = useClaimGasPass();\n\n // TODO: improve pending state since this is kicked off automatically and showing a pending button is weird\n useEffect(() => {\n if (isActive && claimGasPass.status === \"idle\" && allowance.data && allowance.data.allowance < minGasBalance) {\n claimGasPass.mutate(userAddress);\n }\n }, [allowance.data, claimGasPass, isActive, userAddress]);\n\n // TODO: show error if allowance fails to load\n // TODO: show claim error\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-between gap-4\">\n <div>\n <div>Allowance</div>\n <div className=\"font-mono text-white\">\n {allowance.data ? <Balance wei={allowance.data.allowance} /> : <PendingIcon />}\n </div>\n </div>\n <Button\n variant={isActive ? \"primary\" : \"secondary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n 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 { Address, ContractFunctionParameters, Abi } from \"viem\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { getAction } from \"viem/utils\";\nimport { sendUserOperation, waitForUserOperationReceipt } from \"viem/account-abstraction\";\nimport { useEntryKitConfig } from \"../EntryKitConfigProvider\";\nimport { ConnectedClient, unlimitedDelegationControlId, worldAbi } from \"../common\";\nimport { paymasterAbi } from \"../paymaster\";\nimport { writeContract } from \"viem/actions\";\nimport { getSpenderQueryKey } from \"./useSpender\";\nimport { getDelegationQueryKey } from \"./useDelegation\";\n\nfunction defineCall<abi extends Abi | readonly unknown[]>(\n call: Omit<ContractFunctionParameters<abi>, \"address\"> & {\n to: Address;\n value?: bigint | undefined;\n },\n) {\n return call;\n}\n\nexport function useSetupAppAccount() {\n const { worldAddress, paymasterAddress } = useEntryKitConfig();\n const queryClient = useQueryClient();\n\n return useMutation({\n onError: (error) => console.error(error),\n mutationKey: [\"setupAppAccount\"],\n mutationFn: async ({\n userClient,\n appAccountAddress,\n registerSpender,\n registerDelegation,\n }: {\n userClient: ConnectedClient;\n appAccountAddress: Address;\n registerSpender: boolean;\n registerDelegation: boolean;\n }): Promise<void> => {\n // TODO: for non-smart accounts, collect signatures and store to be executed later?\n if (userClient.account.type !== \"smart\") {\n await getAction(\n userClient,\n writeContract,\n \"writeContract\",\n )({\n chain: userClient.chain,\n account: userClient.account,\n address: paymasterAddress,\n abi: paymasterAbi,\n functionName: \"registerSpender\",\n args: [appAccountAddress],\n });\n await getAction(\n userClient,\n writeContract,\n \"writeContract\",\n )({\n chain: userClient.chain,\n account: userClient.account,\n address: worldAddress,\n abi: worldAbi,\n functionName: \"registerDelegation\",\n args: [appAccountAddress, unlimitedDelegationControlId, \"0x\"],\n });\n }\n\n const calls = [];\n\n if (registerSpender) {\n console.log(\"registering spender\");\n calls.push(\n defineCall({\n to: paymasterAddress,\n abi: paymasterAbi,\n functionName: \"registerSpender\",\n args: [appAccountAddress],\n }),\n );\n }\n\n if (registerDelegation) {\n console.log(\"registering delegation\");\n calls.push(\n defineCall({\n to: worldAddress,\n abi: worldAbi,\n functionName: \"registerDelegation\",\n args: [appAccountAddress, unlimitedDelegationControlId, \"0x\"],\n }),\n );\n }\n\n if (!calls.length) return;\n\n console.log(\"setting up account with\", calls);\n const hash = await getAction(userClient, sendUserOperation, \"sendUserOperation\")({ calls });\n console.log(\"got user op hash\", hash);\n\n const receipt = await getAction(userClient, waitForUserOperationReceipt, \"waitForUserOperationReceipt\")({ hash });\n console.log(\"got user op receipt\", receipt);\n\n await queryClient.invalidateQueries({ queryKey: [\"readContract\"] });\n\n // TODO: throw if revert?\n if (!receipt.success) return;\n\n if (registerSpender) {\n const queryKey = getSpenderQueryKey({\n client: userClient,\n paymasterAddress,\n userAddress: userClient.account.address,\n appAccountAddress,\n });\n queryClient.setQueryData(queryKey, true);\n }\n\n if (registerDelegation) {\n const queryKey = getDelegationQueryKey({\n client: userClient,\n worldAddress,\n userAddress: userClient.account.address,\n appAccountAddress,\n });\n queryClient.setQueryData(queryKey, true);\n }\n },\n });\n}\n","import { useAppAccountClient } from \"../useAppAccountClient\";\nimport { Button } from \"../ui/Button\";\nimport { useSetupAppAccount } from \"./useSetupAppAccount\";\nimport { useAccountModal } from \"../useAccountModal\";\nimport { ConnectedClient } from \"../common\";\n\nexport type Props = {\n 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 { closeAccountModal } = useAccountModal();\n const appAccountClient = useAppAccountClient(userClient.account.address);\n const setup = useSetupAppAccount();\n\n const isReady = !registerDelegation && !registerDelegation;\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\">{isReady ? \"Enabled\" : \"Set up\"}</div>\n </div>\n {isReady ? (\n <Button variant={isActive ? \"primary\" : \"secondary\"} className=\"flex-shrink-0 text-sm p-1 w-28\" disabled>\n {/* TODO: revoke */}\n Disable\n </Button>\n ) : (\n <Button\n variant={isActive ? \"primary\" : \"secondary\"}\n className=\"flex-shrink-0 text-sm p-1 w-28\"\n pending={!appAccountClient.data || setup.status === \"pending\"}\n onClick={\n appAccountClient.data\n ? async () => {\n await setup.mutateAsync({\n userClient,\n appAccountAddress: appAccountClient.data.account.address,\n registerSpender,\n registerDelegation,\n });\n closeAccountModal();\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 { ReactNode, useState } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { ErrorNotice } from \"./ErrorNotice\";\nimport { wait } from \"@latticexyz/common/utils\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useIsMounted } from \"usehooks-ts\";\nimport { PendingIcon } from \"./icons/PendingIcon\";\n\nexport type Props = {\n children: ReactNode;\n};\n\nexport function AccountModalErrorBoundary({ children }: Props) {\n const isMounted = useIsMounted();\n const [retries, setRetries] = useState(1);\n\n // TODO: invalidate query cache?\n\n return (\n <ErrorBoundary\n fallbackRender={({ error, resetErrorBoundary }) => (\n <div className={twMerge(\"flex-grow flex flex-col justify-center p-5 gap-2\")}>\n <ErrorNotice error={error instanceof Error ? error.stack ?? error.message : error} />\n {retries > 0 ? (\n <button\n type=\"button\"\n onClick={async (event) => {\n // fake pending state while we retry so that if the same error occurs,\n event.currentTarget.ariaBusy = \"true\";\n await wait(1000);\n resetErrorBoundary();\n if (isMounted()) {\n setRetries((value) => value - 1);\n event.currentTarget.ariaBusy = null;\n }\n }}\n className=\"group aria-busy:pointer-events-none self-end flex items-center gap-1\"\n >\n <PendingIcon className=\"transition opacity-0 group-aria-busy:opacity-100 text-xs text-neutral-500 dark:text-neutral-400\" />\n <span className=\"text-sm text-neutral-500 dark:text-neutral-400 group-hover:text-black dark:group-hover:text-white\">\n Retry?\n </span>\n </button>\n ) : null}\n </div>\n )}\n >\n {children}\n </ErrorBoundary>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { BaseError, UserRejectedRequestError } from \"viem\";\n\nexport type Props = {\n title?: string;\n error?: unknown;\n};\n\nexport function ErrorNotice({ title: initialTitle, error }: Props) {\n if (!error) return null;\n // no need to let users know they rejected\n if (error instanceof BaseError && error.walk((e) => e instanceof UserRejectedRequestError) != null) {\n return null;\n }\n\n // TODO: extract title from error name or first line of error message?\n const title = initialTitle ?? \"Error\";\n\n // TODO: do something to protect against `[object Object]`\n const message =\n typeof error === \"string\" ? error : error instanceof Error ? String(error) : \"Something unexpected happened.\";\n\n // TODO: add \"report error\" link\n\n return (\n <div\n className={twMerge(\n \"text-sm border-l-4 border-red-500\",\n \"bg-red-100 text-red-900\",\n \"dark:bg-red-900 dark:text-red-50\",\n )}\n >\n <div className=\"p-3 font-semibold\">{title}</div>\n <div className=\"px-3 whitespace-break-spaces break-all max-h-32 overflow-y-scroll\">{message}</div>\n </div>\n );\n}\n","import { SVGProps } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = SVGProps<SVGSVGElement>;\n\nexport function IconSVG({ className, children, ...props }: Props) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={twMerge(\"-my-[0.125em] h-[1.25em] w-[1.25em]\", className)}\n {...props}\n >\n {children}\n </svg>\n );\n}\n","import { IconSVG, Props } from \"./IconSVG\";\n\nexport function CloseIcon(props: Props) {\n return (\n <IconSVG strokeWidth=\"2\" stroke=\"currentColor\" {...props}>\n <path\n d=\"M6 18L18 6M6 6L18 18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconSVG>\n );\n}\n","import { type ReactNode } from \"react\";\nimport { AccountModal } from \"./AccountModal\";\nimport { EntryKitConfig } from \"./config\";\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 { usePreparedAppAccountClient } from \"./usePreparedAppAccountClient\";\n\nconst containerClassNames = twMerge(\n \"w-48 inline-flex outline-none transition\",\n \"border border-transparent\",\n \"text-base leading-none\",\n);\n\nconst secondaryClassNames = twMerge(\n \"bg-neutral-100 border-neutral-300 text-black\",\n \"dark:bg-neutral-800 dark:border-neutral-700 dark:text-white\",\n);\nconst secondaryInteractiveClassNames = twMerge(\n \"cursor-pointer outline-none hover:bg-neutral-200 data-[highlighted]:bg-neutral-200 dark:hover:bg-neutral-700\",\n);\n\nexport function AccountButton() {\n const { openAccountModal, accountModalOpen } = useAccountModal();\n const { status, address } = useAccount();\n\n // TODO: use this to show indicator when onboarding is not complete\n usePreparedAppAccountClient();\n\n return (\n <Shadow mode=\"child\">\n {status === \"connected\" || (status === \"reconnecting\" && address) ? (\n <button\n // key is used to avoid triggering transitions between connected/disconnected states\n key=\"connected\"\n type=\"button\"\n className={twMerge(containerClassNames, secondaryClassNames, secondaryInteractiveClassNames, \"p-3\")}\n onClick={openAccountModal}\n >\n <span className=\"flex-grow inline-flex gap-2.5 items-center text-left font-medium\">\n <AccountName address={address} />\n </span>\n </button>\n ) : (\n <button\n // key is used to avoid triggering transitions between connected/disconnected states\n key=\"sign in\"\n type=\"button\"\n className={twMerge(\n containerClassNames,\n \"group\",\n \"items-center justify-center gap-2.5 p-3\",\n \"bg-orange-500 text-white font-medium\",\n \"hover:bg-orange-400\",\n \"active:bg-orange-600\",\n // \"aria-busy:saturate-50\",\n )}\n aria-busy={accountModalOpen}\n onClick={openAccountModal}\n >\n <span className=\"pointer-events-none inline-grid place-items-center -ml-3\">\n <span\n className={twMerge(\n \"col-start-1 row-start-1 leading-none\",\n \"scale-100 opacity-100 transition duration-300\",\n \"group-aria-busy:scale-125 group-aria-busy:opacity-0\",\n )}\n >\n <Logo />\n </span>\n <span\n aria-hidden\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"scale-50 opacity-0 transition duration-300 delay-50\",\n \"group-aria-busy:scale-100 group-aria-busy:opacity-100\",\n )}\n >\n <PendingIcon />\n </span>\n </span>\n <span className=\"font-medium\">Sign in</span>\n </button>\n )}\n </Shadow>\n );\n}\n","import { Hex } from \"viem\";\nimport { useENS } from \"./useENS\";\nimport { Logo } from \"./icons/Logo\";\nimport { TruncatedHex } from \"./ui/TruncatedHex\";\nimport { usePreloadImage } from \"./usePreloadImage\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type Props = {\n address: Hex | undefined;\n};\n\nexport function AccountName({ address }: Props) {\n const { data: ens } = useENS(address);\n const { isSuccess: hasAvatar } = usePreloadImage(ens.avatar);\n\n return (\n <>\n <span className=\"flex-shrink-0 w-6 h-6 -my-1 -mx-0.5 grid place-items-center\">\n <img\n src={hasAvatar ? ens.avatar : undefined}\n className={twMerge(\n \"col-start-1 row-start-1\",\n \"inline-flex w-full h-full rounded-full bg-black/10 dark:bg-white/10 bg-cover bg-no-repeat bg-center\",\n hasAvatar ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <Logo\n className={twMerge(\n \"col-start-1 row-start-1 text-orange-500\",\n \"transition duration-300\",\n hasAvatar ? \"opacity-0\" : \"opacity-100\",\n )}\n />\n </span>\n <span className=\"flex-grow\">{ens.name ?? (address ? <TruncatedHex hex={address} /> : null)}</span>\n </>\n );\n}\n","// Used externally and only provides the app account client once all requirements are met.\n\nimport { useMemo } from \"react\";\nimport { useConnectorClient } from \"wagmi\";\nimport { useAppAccountClient } from \"./useAppAccountClient\";\nimport { useEntryKitConfig } from \"./EntryKitConfigProvider\";\nimport { useSteps } from \"./onboarding/useSteps\";\nimport { AppAccountClient } from \"./common\";\n\nexport function usePreparedAppAccountClient(): AppAccountClient | undefined {\n const { chainId } = useEntryKitConfig();\n const { data: userClient, error: userClientError } = useConnectorClient({ chainId });\n if (userClientError) console.error(\"Error retrieving user client\", userClientError);\n\n const appAccountClient = useAppAccountClient(userClient?.account.address);\n const steps = useSteps(userClient);\n\n return useMemo(() => {\n if (!steps.every((step) => step.isComplete)) return;\n return appAccountClient.data;\n }, [appAccountClient.data, steps]);\n}\n","import { Chain, Transport } from \"viem\";\nimport { EntryKitConfig } from \"./config\";\nimport { WalletList, connectorsForWallets, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { createConfig } from \"wagmi\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\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> = Pick<EntryKitConfig, \"chainId\" | \"bundlerTransport\" | \"paymasterAddress\"> & {\n readonly chains: chains;\n readonly transports: transports;\n readonly walletConnectProjectId: string;\n readonly appInfo: {\n readonly name: string;\n };\n};\n\nexport function createWagmiConfig<\n const chains extends readonly [Chain, ...Chain[]],\n transports extends Record<chains[number][\"id\"], Transport>,\n>(config: CreateWagmiConfigOptions<chains, transports>) {\n const { wallets: defaultWallets } = getDefaultWallets();\n const wallets: WalletList = [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n bundlerTransport: config.bundlerTransport,\n paymasterAddress: config.paymasterAddress,\n }),\n ],\n },\n ...defaultWallets,\n ];\n\n const connectors = connectorsForWallets(wallets, {\n appName: config.appInfo.name,\n projectId: config.walletConnectProjectId,\n });\n\n return createConfig({\n connectors,\n chains: config.chains,\n transports: config.transports,\n });\n}\n","import { Wallet } from \"@rainbow-me/rainbowkit\";\nimport { PasskeyConnectorOptions, passkeyConnector } from \"./passkeyConnector\";\n\nconst iconUrl = `data:image/svg+xml;base64,${btoa(\n // eslint-disable-next-line max-len\n '<svg xmlns=\"http://www.w3.org/2000/svg\" shape-rendering=\"geometricPrecision\" text-rendering=\"geometricPrecision\" image-rendering=\"optimizeQuality\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" width=\"512\" height=\"512\" viewBox=\"-64 -32 608 512\"><path d=\"M6.206 425.469A6.202 6.202 0 010 419.263c0-1.771.235-3.517.663-5.245 9.95-78.847 57.22-96.006 100.964-107.256 21.008-5.412 62.901-26.489 57.822-53.668-10.596-9.819-21.113-23.39-22.946-43.63l-1.274.026c-2.932-.044-5.778-.716-8.422-2.217-5.848-3.325-9.051-9.697-10.596-16.958-3.238-22.186-4.058-33.515 7.768-38.464l.096-.035c-1.467-27.37 3.159-67.64-24.944-76.141C154.622 7.1 218.597-30.203 266.627 30.805c53.519 2.801 77.389 78.611 44.154 121.046h-1.405c11.826 4.949 10.045 17.674 7.767 38.464-1.544 7.261-4.747 13.633-10.595 16.958-2.645 1.501-5.481 2.173-8.422 2.217l-1.275-.026c-1.833 20.24-12.376 33.811-22.972 43.63-4.459 23.871 27.275 43.011 49.33 50.997a139.442 139.442 0 004.268 5.525c-7.2 9.941-8.771 22.797-4.564 34.038-17.002 8.763-24.255 29.334-16.479 46.86-11.966 7.55-18.258 21.305-16.609 34.955H6.206zm419.058-105.362a86.778 86.778 0 0019.446-1.641c29.36-5.822 53.152-27.467 62.657-55.823 3.596-10.544 5.071-21.663 4.521-33.341-1.179-23.46-12.193-46.633-29.631-62.369-17.107-15.361-38.342-23.574-61.383-23.042-22.841.507-45.359 11.216-60.187 28.593-14.977 17.551-22.003 39.144-20.921 62.133.585 11.661 3.482 23.016 8.737 34.074 7.741 16.303 19.934 29.735 35.391 39.048l-22.457 20.711 13.232 27.86-29.413 13.973 13.991 29.456-26.769 12.717 16.81 35.374 35.601-16.915 40.375-110.808zm15.239-129.364c13.685 4.869 20.824 19.908 15.954 33.593-4.87 13.685-19.908 20.833-33.593 15.963-13.685-4.87-20.834-19.917-15.963-33.602 4.87-13.685 19.917-20.825 33.602-15.954z\"/></svg>',\n)}`;\n\nexport type PasskeyWalletOptions = PasskeyConnectorOptions;\n\nexport const passkeyWallet = (opts: PasskeyWalletOptions) => (): Wallet => ({\n id: \"passkey\",\n name: \"Passkey\",\n iconUrl,\n iconBackground: \"#fec\",\n createConnector: (walletDetails) => (config) => ({\n ...passkeyConnector(opts)(config),\n ...walletDetails,\n }),\n});\n","import { Account } from \"viem\";\nimport { ToCoinbaseSmartAccountReturnType } from \"./toCoinbaseSmartAccount\";\n\nexport function isCoinbaseSmartAccount(account: Account | undefined): account is ToCoinbaseSmartAccountReturnType {\n return account != null && \"__isCoinbaseSmartAccount\" in account && account.__isCoinbaseSmartAccount === true;\n}\n","import { Hash, Hex, RpcTransactionReceipt, RpcUserOperationReceipt, Transport } from \"viem\";\n\nexport const wiresawChainIds = new Set([17420, 31337]);\n\nexport function wiresaw<const transport extends Transport>(originalTransport: transport): transport {\n return ((opts) => {\n const { request: originalRequest, ...rest } = originalTransport(opts);\n\n let chainId: Hex | null = null;\n const receipts = new Map<Hash, RpcTransactionReceipt | RpcUserOperationReceipt>();\n\n return {\n ...rest,\n async request(req) {\n // console.log(\"wiresaw: got rpc call\", req.method, JSON.stringify(req.params ?? []));\n\n if (req.method === \"eth_chainId\") {\n if (chainId != null) return chainId;\n return (chainId = await originalRequest(req));\n }\n\n // if (req.method === \"eth_estimateGas\") {\n // return originalRequest({ ...req, method: \"wiresaw_estimateGas\" });\n // }\n\n // if (req.method === \"eth_sendRawTransaction\") {\n // const receipt = (await originalRequest({\n // ...req,\n // method: \"wiresaw_sendRawTransaction\",\n // // TODO: type `request` so we don't have to cast\n // })) as RpcTransactionReceipt;\n // // TODO: wiresaw should return an appropriate error here\n // if (receipt == null) {\n // throw new Error(\"Failed to include transaction.\");\n // }\n // receipts.set(receipt[\"transactionHash\"], receipt);\n // return receipt[\"transactionHash\"];\n // }\n\n if (req.method === \"eth_getTransactionReceipt\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hash = (req.params as any)[0] as Hash;\n const receipt = receipts.get(hash) ?? ((await originalRequest(req)) as RpcTransactionReceipt);\n if (!receipts.has(hash)) receipts.set(hash, receipt);\n return receipt;\n }\n\n if (req.method === \"eth_sendUserOperation\") {\n // TODO: type `request` so we don't have to cast\n const result = (await originalRequest({\n ...req,\n method: \"wiresaw_sendUserOperation\",\n })) as { txHash: Hex; userOpHash: Hex };\n // :haroldsmile:\n receipts.set(result.userOpHash, {\n success: true,\n userOpHash: result.userOpHash,\n receipt: { transactionHash: result.txHash },\n } as RpcUserOperationReceipt);\n return result.userOpHash;\n }\n\n if (req.method === \"eth_getUserOperationReceipt\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hash = (req.params as any)[0] as Hash;\n const receipt = receipts.get(hash) ?? ((await originalRequest(req)) as RpcUserOperationReceipt);\n if (!receipts.has(hash)) receipts.set(hash, receipt);\n return receipt;\n }\n\n return originalRequest(req);\n },\n };\n }) as transport;\n}\n","import { EntryKitConfig } from \"./config\";\nimport { WalletList, connectorsForWallets } from \"@rainbow-me/rainbowkit\";\nimport { getWallets } from \"./getWallets\";\nimport { CreateConnectorFn } from \"wagmi\";\n\nexport function getConnectors({\n wallets,\n ...config\n}: EntryKitConfig & { readonly wallets?: WalletList }): CreateConnectorFn[] {\n return connectorsForWallets(wallets ?? getWallets(config), {\n appName: config.appInfo?.name ?? document.title,\n projectId: config.walletConnectProjectId,\n });\n}\n","import { EntryKitConfig } from \"./config\";\nimport { WalletList, getDefaultWallets } from \"@rainbow-me/rainbowkit\";\nimport { passkeyWallet } from \"./passkey/passkeyWallet\";\n\nexport function getWallets(config: EntryKitConfig): WalletList {\n const { wallets: defaultWallets } = getDefaultWallets();\n return [\n {\n groupName: \"Recommended\",\n wallets: [\n passkeyWallet({\n // TODO: allow any chain ID\n chainId: config.chainId,\n bundlerTransport: config.bundlerTransport,\n paymasterAddress: config.paymasterAddress,\n }),\n ],\n },\n ...defaultWallets,\n ];\n}\n"],"mappings":"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","names":["DialogRoot","DialogPortal","DialogContent","forwardRef","useEffect","useRef","useState","ReactDOM","useResizeObserver","mergeRefs","createContext","useContext","jsx","Context","FrameProvider","frame","children","useMediaQuery","createContext","useContext","RainbowKitProvider","lightTheme","midnightTheme","jsx","Context","EntryKitConfigProvider","config","children","useEntryKitConfig","useTheme","initialTheme","useEntryKitConfig","darkMode","useMediaQuery","jsx","jsxs","Resizer","onSize","props","ref","useRef","useResizeObserver","Shadow","forwardRef","mode","children","forwardedRef","frameRef","loaded","setLoaded","useState","frame","frameSize","setFrameSize","frameDocument","theme","useTheme","useEffect","frameStyle","mergeRefs","ReactDOM","FrameProvider","tailwind_default","twMerge","jsx","jsxs","Modal","open","onOpenChange","children","DialogRoot","DialogPortal","Shadow","DialogContent","event","useCallback","useMemo","useStore","createStore","store","useAccountModal","accountModalOpen","state","openAccountModal","closeAccountModal","toggleAccountModal","open","twMerge","useConnectorClient","useAccount","twMerge","twMerge","jsx","jsxs","PendingIcon","className","props","jsx","jsxs","buttonClassName","variant","twMerge","Button","pending","type","className","children","disabled","props","PendingIcon","useConnectModal","useMutation","useConnectors","createClient","custom","getAddress","numberToHex","SwitchChainError","ChainNotConfiguredError","createConnector","createStore","persist","cache","listener","event","smartAccountActions","toWebAuthnAccount","BaseError","pad","encodeFunctionData","hashMessage","hashTypedData","encodeAbiParameters","stringToHex","size","encodePacked","parseSignature","entryPoint07Abi","entryPoint07Address","getUserOperationHash","toSmartAccount","readContract","parseP256Signature","toCoinbaseSmartAccount","parameters","client","owners","nonce","address","entryPoint","factory","factoryAbi","accountToBytes","account","owner","ownerIndex","abi","calls","call","factoryData","wrapSignature","hash","toReplaySafeHash","signature","sign","message","domain","types","primaryType","chainId","userOperation","webauthn","toWebAuthnSignature","r","s","signatureData","getAccount","client","id","publicKeys","cache","publicKey","owners","toWebAuthnAccount","toCoinbaseSmartAccount","bytesToHex","hashMessage","sign","bytesToHex","hexToBytes","concatBytes","utf8ToBytes","getMessageHash","webauthn","authenticatorData","challengeIndexRaw","clientDataJSON","typeIndexRaw","userVerificationRequired","typeIndex","challengeIndex","authenticatorDataBytes","flag","type","clientDataJSONHash","messageHash","sign","parseSignature","serializePublicKey","secp256r1","getCandidatePublicKeys","input","r","s","candidate1","candidate2","hashMessage","findPublicKey","input1","input2","firstDuplicate","getCandidatePublicKeys","recoverPasskeyPublicKey","input","message2","signature2","webauthn2","credential","sign","messageHash2","getMessageHash","publicKey","arr","seen","s","reusePasskey","randomChallenge","bytesToHex","messageHash","hashMessage","signature","webauthn","credential","sign","publicKey","cache","webauthnHash","getMessageHash","passkey","recoverPasskeyPublicKey","state","createCredential","createPasskey","credential","createCredential","cache","state","resourceToHex","parseAbi","worldConfig","defaultClientConfig","unlimitedDelegationControlId","worldTables","worldAbi","viem_createBundlerClient","knownChainFees","createBundlerClient","paymasterAddress","config","chain","viem_createBundlerClient","defaultClientConfig","observer","passkeyConnector","chainId","bundlerTransport","paymasterAddress","explorerUrl","createConnector","config","chain","transport","client","createClient","defaultClientConfig","connected","cache","id","createPasskey","account","getAccount","numberToHex","reusePasskey","params","accounts","c","SwitchChainError","ChainNotConfiguredError","a","getAddress","_connectInfo","_error","credentialId","createBundlerClient","smartAccountActions","_params","custom","usePasskeyConnector","connector","useConnectors","c","passkeyConnector","twMerge","jsx","jsxs","Logo","className","props","useAppInfo","appInfo","useEntryKitConfig","appName","appOrigin","appIcon","appImage","useQuery","usePreloadImage","url","resolve","reject","image","jsx","jsxs","AppInfo","appName","appIcon","useAppInfo","hasAppIcon","appIconLoading","usePreloadImage","Logo","twMerge","jsx","jsxs","ConnectWallet","userAccount","useAccount","accountModalOpen","useAccountModal","openConnectModal","connectModalOpen","useConnectModal","passkeyConnector","usePasskeyConnector","createPasskey","useMutation","error","reusePasskey","hasPasskey","buttons","Button","AppInfo","useState","useMemo","parseEther","minGasBalance","useReadContract","IStoreReadAbi","decodeValueArgs","getKeyTuple","getSchemaTypes","getValueSchema","useRecord","table","key","opts","data","defineStore","parseAbi","paymasterAbi","paymasterConfig","paymasterTables","useAllowance","user","chainId","paymasterAddress","useEntryKitConfig","useRecord","paymasterTables","useClient","useQuery","createStore","persist","store","appSigners","listener","event","generatePrivateKey","privateKeyToAccount","getAppSigner","userAddress","appSignerPrivateKey","store","privateKey","state","smartAccountActions","callFrom","observer","getAppAccountClient","worldAddress","userAddress","client","bundlerTransport","paymasterAddress","explorerUrl","appSigner","getAppSigner","account","toCoinbaseSmartAccount","createBundlerClient","smartAccountActions","callFrom","useAppAccountClient","userAddress","chainId","bundlerTransport","paymasterAddress","worldAddress","explorerUrl","useEntryKitConfig","client","useClient","queryKey","useQuery","getAppAccountClient","useClient","decodeValueArgs","getKeyTuple","getSchemaTypes","getValueSchema","readContract","getAction","getRecord","client","address","table","key","blockTag","staticData","encodedLengths","dynamicData","abi","useQuery","getSpenderQueryKey","client","paymasterAddress","userAddress","appAccountAddress","useSpender","chainId","useEntryKitConfig","useClient","queryKey","getRecord","paymasterTables","useClient","useQuery","getDelegationQueryKey","client","worldAddress","userAddress","appAccountAddress","useDelegation","chainId","useEntryKitConfig","useClient","queryKey","useQuery","getRecord","worldTables","unlimitedDelegationControlId","useDisconnect","useQuery","useENS","address","normalizedAddress","data","res","jsx","jsxs","TruncatedHex","hex","jsx","jsxs","Wallet","isActive","isExpanded","userAddress","ens","useENS","disconnect","disconnectIsPending","useDisconnect","closeAccountModal","useAccountModal","TruncatedHex","Button","useMutation","useQueryClient","useClaimGasPass","queryClient","passIssuerTransport","useEntryKitConfig","error","userAddress","transport","twMerge","jsx","jsxs","EthIcon","className","props","formatEther","formatBalance","wei","formatted","magnitude","jsx","jsxs","Balance","wei","formatBalance","EthIcon","useEffect","jsx","jsxs","Allowance","isActive","isExpanded","userAddress","allowance","useAllowance","claimGasPass","useClaimGasPass","useEffect","minGasBalance","Balance","PendingIcon","Button","useMutation","useQueryClient","getAction","sendUserOperation","waitForUserOperationReceipt","writeContract","useSetupAppAccount","worldAddress","paymasterAddress","useEntryKitConfig","queryClient","useQueryClient","useMutation","error","userClient","appAccountAddress","registerSpender","registerDelegation","getAction","writeContract","paymasterAbi","worldAbi","unlimitedDelegationControlId","calls","hash","sendUserOperation","receipt","waitForUserOperationReceipt","queryKey","getSpenderQueryKey","getDelegationQueryKey","jsx","jsxs","Session","isActive","isExpanded","userClient","registerSpender","registerDelegation","closeAccountModal","useAccountModal","appAccountClient","useAppAccountClient","setup","useSetupAppAccount","isReady","Button","jsx","useSteps","userClient","userAddress","allowance","useAllowance","appAccountClient","useAppAccountClient","isSpender","useSpender","hasDelegation","useDelegation","useMemo","props","Wallet","minGasBalance","Allowance","Session","twMerge","jsx","ConnectedSteps","userClient","steps","useSteps","selectedStepId","useState","nextStep","step","completedSteps","activeStep","activeStepIndex","i","isActive","isExpanded","isDisabled","jsx","AccountModalContent","chainId","useEntryKitConfig","userClient","useConnectorClient","ConnectWallet","ConnectedSteps","useState","ErrorBoundary","twMerge","BaseError","UserRejectedRequestError","jsx","jsxs","ErrorNotice","initialTitle","error","e","title","message","wait","twMerge","useIsMounted","jsx","jsxs","AccountModalErrorBoundary","children","isMounted","useIsMounted","retries","setRetries","useState","ErrorBoundary","error","resetErrorBoundary","twMerge","ErrorNotice","event","wait","value","PendingIcon","DialogClose","DialogTitle","twMerge","jsx","IconSVG","className","children","props","jsx","CloseIcon","props","IconSVG","jsx","jsxs","AccountModal","accountModalOpen","toggleAccountModal","useAccountModal","Modal","DialogTitle","twMerge","AccountModalErrorBoundary","AccountModalContent","Logo","DialogClose","CloseIcon","jsx","jsxs","EntryKitProvider","config","children","EntryKitConfigProvider","AccountModal","useAccount","twMerge","twMerge","Fragment","jsx","jsxs","AccountName","address","ens","useENS","hasAvatar","usePreloadImage","Logo","TruncatedHex","useMemo","useConnectorClient","usePreparedAppAccountClient","chainId","useEntryKitConfig","userClient","userClientError","useConnectorClient","appAccountClient","useAppAccountClient","steps","useSteps","useMemo","step","jsx","jsxs","containerClassNames","twMerge","secondaryClassNames","secondaryInteractiveClassNames","AccountButton","openAccountModal","accountModalOpen","useAccountModal","status","address","useAccount","usePreparedAppAccountClient","Shadow","AccountName","Logo","PendingIcon","connectorsForWallets","getDefaultWallets","createConfig","iconUrl","passkeyWallet","opts","walletDetails","config","passkeyConnector","createWagmiConfig","config","defaultWallets","getDefaultWallets","wallets","passkeyWallet","connectors","connectorsForWallets","createConfig","isCoinbaseSmartAccount","account","wiresawChainIds","wiresaw","originalTransport","opts","originalRequest","rest","chainId","receipts","req","hash","receipt","result","connectorsForWallets","getDefaultWallets","getWallets","config","defaultWallets","getDefaultWallets","passkeyWallet","getConnectors","wallets","config","connectorsForWallets","getWallets"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/entrykit",
3
- "version": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30",
3
+ "version": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10",
4
4
  "description": "User onboarding flows for MUD projects",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,13 +40,13 @@
40
40
  "usehooks-ts": "^3.1.0",
41
41
  "webauthn-p256": "^0.0.10",
42
42
  "zustand": "^4.5.2",
43
- "@latticexyz/common": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30",
44
- "@latticexyz/config": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30",
45
- "@latticexyz/explorer": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30",
46
- "@latticexyz/protocol-parser": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30",
47
- "@latticexyz/store": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30",
48
- "@latticexyz/world": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30",
49
- "@latticexyz/world-modules": "2.2.13-entrykit-5d62534376961deb34e503b8435e11d744602e30"
43
+ "@latticexyz/common": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10",
44
+ "@latticexyz/config": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10",
45
+ "@latticexyz/explorer": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10",
46
+ "@latticexyz/protocol-parser": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10",
47
+ "@latticexyz/store": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10",
48
+ "@latticexyz/world": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10",
49
+ "@latticexyz/world-modules": "2.2.14-entrykit-bcef42396222d6ddf70695ff6587a6fab606ed10"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@tanstack/react-query": "^5.56.2",