@crossmint/client-sdk-smart-wallet 0.1.4 → 0.1.5

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.
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var me=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ot=Object.prototype.hasOwnProperty;var st=(r,e)=>{for(var t in e)me(r,t,{get:e[t],enumerable:!0})},it=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of at(e))!ot.call(r,a)&&a!==t&&me(r,a,{get:()=>e[a],enumerable:!(n=nt(e,a))||n.enumerable});return r};var lt=r=>it(me({},"__esModule",{value:!0}),r);var Wt={};st(Wt,{AdminAlreadyUsedError:()=>x,AdminMismatchError:()=>P,Chain:()=>ce.EVMBlockchainIncludingTestnet,ConfigError:()=>C,CrossmintSDKError:()=>m.CrossmintSDKError,CrossmintServiceError:()=>m.CrossmintServiceError,EVMSmartWallet:()=>b,JWTDecryptionError:()=>m.JWTDecryptionError,JWTExpiredError:()=>m.JWTExpiredError,JWTIdentifierError:()=>m.JWTIdentifierError,JWTInvalidError:()=>m.JWTInvalidError,NotAuthorizedError:()=>m.NotAuthorizedError,PasskeyIncompatibleAuthenticatorError:()=>v,PasskeyMismatchError:()=>R,PasskeyPromptError:()=>I,PasskeyRegistrationError:()=>O,SmartWalletError:()=>l,SmartWalletErrorCode:()=>m.SmartWalletErrorCode,SmartWalletSDK:()=>le,SmartWalletsNotEnabledError:()=>W,TransferError:()=>m.TransferError,UserWalletAlreadyCreatedError:()=>h,blockchainToChainId:()=>ce.blockchainToChainId});module.exports=lt(Wt);var ce=require("@crossmint/common-sdk-base");var N=require("viem"),ve=require("@crossmint/client-sdk-base");function L(){return typeof window<"u"}function Ee(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function $(r,e){return r?.toLowerCase()===e?.toLowerCase()}var K=class{logInfo(e,t){console.log(e,t)}logError(e,t){console.error(e,t)}logWarn(e,t){console.warn(e,t)}};var F=require("@datadog/browser-logs");var Pe="ZeroDev";var he="pub035be8a594b35be1887b6ba76c4029ca",Ce="http://localhost:3000/api",Te="https://staging.crossmint.com/api",Ae="https://www.crossmint.com/api",T="SCW_SDK",we="0.1.0",B="2024-06-09",be="https://rpc.zerodev.app/api/v2/bundler/";var de=["0.3.1","0.3.0","0.2.4"],ue=["v0.6","v0.7"];var A=class{logInfo(e,t){ye(e,"info",t)}logError(e,t){ye(e,"error",t)}logWarn(e,t){ye(e,"warn",t)}};function ye(r,e,t){let n=t?{...t,service:T}:{service:T};ct(),F.datadogLogs.logger[e](r,n)}function ct(){F.datadogLogs.getInternalContext()==null&&F.datadogLogs.init({clientToken:he,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function pt(){return L()&&Ee()?new K:new A}var{logInfo:w,logWarn:Ft,logError:Y}=pt();async function E(r,e,t){let n=new Date().getTime(),a=await e(),o={durationInMs:new Date().getTime()-n,...t};return w(`[${T} - ${r} - TIME] - ${mt(o)}`,{args:o}),a}function mt(r){try{return r!=null?JSON.stringify(r,null,2):r}catch{return dt(r)}}function dt(r){let e={};for(let t in r)Object.prototype.hasOwnProperty.call(r,t)&&typeof r[t]!="object"&&typeof r[t]!="function"&&(e[t]=r[t]);return JSON.stringify(e,null,2)}function Re(r){let e=r instanceof Error?r:{message:"Unknown error",name:"Unknown error"};if(!(e instanceof Error)&&e.constructor?.name!=="SyntheticBaseEvent")throw Y("ERROR_TO_JSON_FAILED",{error:e}),new Error("[errorToJSON] err is not instanceof Error nor SyntheticBaseEvent");return JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}var j=require("viem");var Ie=[{inputs:[{internalType:"string",name:"uri_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[]",name:"ids",type:"uint256[]"},{indexed:!1,internalType:"uint256[]",name:"values",type:"uint256[]"}],name:"TransferBatch",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"id",type:"uint256"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"TransferSingle",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"string",name:"value",type:"string"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"URI",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"id",type:"uint256"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address[]",name:"accounts",type:"address[]"},{internalType:"uint256[]",name:"ids",type:"uint256[]"}],name:"balanceOfBatch",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256[]",name:"ids",type:"uint256[]"},{internalType:"uint256[]",name:"amounts",type:"uint256[]"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeBatchTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"uri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"}];function Oe({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:j.erc20Abi,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:Ie,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:j.erc721Abi,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var b=class{constructor(e,t,n,a){this.crossmintService=e;this.accountClient=t;this.chain=a,this.client={wallet:t,public:n}}get address(){return this.accountClient.account.address}async transferToken(e,t){return E("TRANSFER",async()=>{if(this.chain!==t.token.chain)throw new Error(`Chain mismatch: Expected ${t.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`);if(!(0,N.isAddress)(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!(0,N.isAddress)(t.token.contractAddress))throw new Error(`Invalid contract address: '${t.token.contractAddress}' is not a valid EVM address.`);let n=Oe({contract:t.token.contractAddress,to:e,from:this.accountClient.account,config:t});try{let a=this.accountClient.extend(N.publicActions),{request:s}=await a.simulateContract(n),o=await a.writeContract(s);return w(`[TRANSFER] - Transaction hash from transfer: ${o}`),o}catch(a){Y("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:T,error:Re(a),tokenId:n.tokenId,contractAddress:t.token.contractAddress,chain:t.token.chain});let s=n.tokenId==null?"":`:${n.tokenId}}`;throw new ve.TransferError(`Error transferring token ${t.token.contractAddress}${s}`)}},{toAddress:e,config:t})}async nfts(){return this.crossmintService.fetchNFTs(this.address,this.chain)}};var y=require("@crossmint/client-sdk-base"),l=class extends y.CrossmintSDKError{constructor(e,t,n=y.SmartWalletErrorCode.UNCATEGORIZED){super(e,n,t)}},P=class extends l{constructor(e,t,n){super(e,y.SmartWalletErrorCode.ADMIN_MISMATCH),this.required=t,this.used=n}},R=class extends l{constructor(e,t,n){super(e,y.SmartWalletErrorCode.PASSKEY_MISMATCH),this.required=t,this.used=n}},h=class extends l{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=y.SmartWalletErrorCode.USER_WALLET_ALREADY_CREATED}},I=class extends l{constructor(e){super(`Prompt was either cancelled or timed out for passkey ${e}`,void 0,y.SmartWalletErrorCode.PASSKEY_PROMPT),this.passkeyName=e}},O=class extends l{constructor(e){super(`Registration for passkey ${e} failed, either the registration took too long, or passkey signature vaildation failed.`,void 0,y.SmartWalletErrorCode.PASSKEY_REGISTRATION),this.passkeyName=e}},v=class extends l{constructor(e){super(`User selected authenticator for passkey ${e} is not compatible with Crossmint's Smart Wallets.`,void 0,y.SmartWalletErrorCode.PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=e}},C=class extends l{constructor(e){super(e,void 0,y.SmartWalletErrorCode.WALLET_CONFIG)}},x=class extends C{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=y.SmartWalletErrorCode.ADMIN_SIGNER_ALREADY_USED}},W=class extends C{constructor(){super("Smart wallets are not enabled for this project. They can be enabled on the project settings page in the developer console.");this.code=y.SmartWalletErrorCode.SMART_WALLETS_NOT_ENABLED}};var m=require("@crossmint/client-sdk-base");var et=require("viem"),tt=require("@crossmint/common-sdk-base");var Ue=require("@crossmint/client-sdk-base"),Ve=require("@crossmint/common-sdk-base");var xe=require("@crossmint/client-sdk-base"),We=require("@crossmint/common-sdk-base");var u=require("@crossmint/client-sdk-base");var G=class{constructor(e={ERROR_JWT_INVALID:()=>new u.JWTInvalidError,ERROR_JWT_DECRYPTION:()=>new u.JWTDecryptionError,ERROR_JWT_EXPIRED:({expiredAt:t})=>new u.JWTExpiredError(new Date(t)),ERROR_JWT_IDENTIFIER:({identifierKey:t})=>new u.JWTIdentifierError(t),ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new h(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new x,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new W}){this.errors=e}async throwErrorFromResponse({response:e,onServerErrorMessage:t}){if(!e.ok){if(e.status>=500)throw new u.CrossmintServiceError(t,e.status);if(e.status===402)throw new u.OutOfCreditsError;try{let n=await e.json(),a=n.code;if(a!=null&&this.errors[a]!=null)throw this.errors[a](n);if(n.message!=null)throw new u.CrossmintServiceError(n.message,e.status)}catch(n){if(n instanceof l)throw n;console.error("Error parsing response",n)}throw new u.CrossmintServiceError(await e.text(),e.status)}}};var M=class M{constructor(e){let t=(0,We.validateAPIKey)(e);if(!t.isValid)throw new Error("API key invalid");this.crossmintAPIHeaders={accept:"application/json","content-type":"application/json","x-api-key":e},this.crossmintBaseUrl=this.getUrlFromEnv(t.environment),this.apiErrorService=new G}async fetchCrossmintAPI(e,t={method:"GET"},n,a){return E("FETCH_CROSSMINT_API",async()=>{let s=`${this.crossmintBaseUrl}/${e}`,{body:o,method:i}=t,c;try{c=await fetch(s,{body:o,method:i,headers:{...this.crossmintAPIHeaders,...a!=null&&{Authorization:`Bearer ${a}`}}})}catch(S){throw new xe.CrossmintServiceError(`Error fetching Crossmint API: ${S}`)}return c.ok||await this.apiErrorService.throwErrorFromResponse({response:c,onServerErrorMessage:n}),await c.json()},{endpoint:e})}getUrlFromEnv(e){let t=M.urlMap[e];if(!t)throw console.log(" CrossmintService.urlMap: ",M.urlMap),new Error(`URL not found for environment: ${e}`);return t}};M.urlMap={development:Ce,staging:Te,production:Ae};var J=M;var ke=require("@zerodev/passkey-validator"),z=require("viem"),p=require("zod");var yt=p.z.custom(r=>(0,z.isHex)(r),{message:"Invalid hex string"}),H=p.z.custom(r=>(0,z.isAddress)(r),{message:"Invalid evm address"}),ft=p.z.object({eoaAddress:H,type:p.z.literal("eoa")}),gt=p.z.object({entryPoint:H,validatorAddress:H,pubKeyX:p.z.string(),pubKeyY:p.z.string(),authenticatorIdHash:yt,authenticatorId:p.z.string()}),St=gt.extend({passkeyName:p.z.string(),validatorContractVersion:p.z.nativeEnum(ke.PasskeyValidatorContractVersion),domain:p.z.string(),type:p.z.literal("passkeys")}),Et=p.z.discriminatedUnion("type",[St,ft]),_e=p.z.object({kernelVersion:p.z.enum(de,{errorMap:(r,e)=>({message:`Unsupported kernel version. Supported versions: ${de.join(", ")}. Version used: ${e.data}. Please contact support`})}),entryPointVersion:p.z.enum(ue,{errorMap:(r,e)=>({message:`Unsupported entry point version. Supported versions: ${ue.join(", ")}. Version used: ${e.data}. Please contact support`})}),userId:p.z.string().min(1),signers:p.z.array(p.z.object({signerData:Et})).min(0).max(1,"Invalid wallet signer configuration. Please contact support"),smartContractWalletAddress:H.optional()});var De=require("viem");function q(r,e){let t=e(r);return t.replace?t.value:Array.isArray(r)?r.map(n=>q(n,e)):r!==null&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([n,a])=>[n,q(a,e)])):t.value}function Ne(r){return q(r,e=>typeof e=="bigint"?{value:(0,De.toHex)(e),replace:!0}:{value:e,replace:!1})}function Me(r){return q(r,e=>e!=null&&typeof e=="object"&&"__xm_serializedType"in e&&"value"in e&&e.__xm_serializedType==="bigint"&&typeof e.value=="string"?{value:BigInt(e.value),replace:!0}:{value:e,replace:!1})}var X=class extends J{async idempotentCreateSmartWallet(e,t){await this.fetchCrossmintAPI(`${B}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(t)},"Error creating abstract wallet. Please contact support",e.jwt)}async sponsorUserOperation(e,t,n,a){let s=(0,Ve.blockchainToChainId)(a),o=await this.fetchCrossmintAPI(`${B}/sdk/paymaster`,{method:"POST",body:JSON.stringify({userOp:Ne(t),entryPoint:n,chainId:s})},"Error sponsoring user operation. Please contact support",e.jwt);return Me(o)}async getSmartWalletConfig(e,t){let n=await this.fetchCrossmintAPI(`${B}/sdk/smart-wallet/config?chain=${t}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",e.jwt),a=_e.safeParse(n);if(a.success)return a.data;throw new Ue.CrossmintServiceError(`Invalid smart wallet config, please contact support. Details below:
2
- ${a.error.toString()}`)}async fetchNFTs(e,t){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${t}:${e}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${e}`)}getPasskeyServerUrl(){return this.crossmintBaseUrl+"/internal/passkeys"}};var k=class{constructor(e){this.type="passkeys";this.data=e}display(){return{pubKeyX:this.data.pubKeyX,pubKeyY:this.data.pubKeyY,passkeyName:this.data.passkeyName,type:this.type}}},_=class{constructor(e){this.type="eoa";this.data=e}display(){return this.data}};var Z=class{constructor(e){this.crossmintService=e}async get(e,t){let{entryPointVersion:n,kernelVersion:a,signers:s,smartContractWalletAddress:o,userId:i}=await this.crossmintService.getSmartWalletConfig(e,t);if(n==="v0.7"&&a.startsWith("0.2")||n==="v0.6"&&a.startsWith("0.3"))throw new l(`Unsupported combination: entryPoint ${n} and kernel version ${a}. Please contact support`);return{entryPointVersion:n,kernelVersion:a,userId:i,existingSignerConfig:this.getSigner(s.map(c=>c.signerData)),smartContractWalletAddress:o}}getSigner(e){if(e.length===0)return;let t=e[0];if(t.type==="eoa")return new _(t);if(t.type==="passkeys")return new k(t)}};function Le(r){let e="signer"in r.walletParams&&"type"in r.walletParams.signer&&r.walletParams.signer.type==="PASSKEY",t=r.existingSignerConfig==null||r.existingSignerConfig.type==="passkeys";return e&&t}function $e(r){let e="signer"in r.walletParams&&("type"in r.walletParams.signer&&r.walletParams.signer.type==="VIEM_ACCOUNT"||"request"in r.walletParams.signer&&typeof r.walletParams.signer.request=="function"),t=r.existingSignerConfig==null||r.existingSignerConfig.type==="eoa";return e&&t}var Q=class{constructor(e,t){this.eoaStrategy=e;this.passkeyStrategy=t}get(e){if(Le(e))return this.passkeyStrategy.create(e);if($e(e))return this.eoaStrategy.create(e);if(e.existingSignerConfig==null)throw new C(`Unsupported wallet params:
3
- ${e.walletParams}`);let t=e.existingSignerConfig.display();throw new P(`Cannot create wallet with ${e.existingSignerConfig.type} signer for user ${e.user.id}', they already have a wallet with signer:
4
- '${t}'`,t)}};var Fe=require("@zerodev/ecdsa-validator"),Ye=require("@zerodev/sdk");var Ke=require("permissionless");async function Be({walletParams:r}){if(Pt(r.signer))return await(0,Ke.providerToSmartAccountSigner)(r.signer);if(ht(r.signer))return r.signer.account;{let e=r.signer;throw new l(`The signer type ${e.type} is not supported`)}}function Pt(r){return r&&typeof r.request=="function"}function ht(r){return r&&r.type==="VIEM_ACCOUNT"}var ee=class{async create({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:s,user:o,existingSignerConfig:i}){let c=await Be({chain:e,walletParams:a});if(i!=null&&!$(c.address,i.data.eoaAddress))throw new P(`User '${o.id}' has an existing wallet with an eoa signer '${i.data.eoaAddress}', this does not match input eoa signer '${c.address}'.`,i.display(),{type:"eoa",eoaAddress:i.data.eoaAddress});let S=await(0,Fe.signerToEcdsaValidator)(t,{signer:c,entryPoint:n.address,kernelVersion:s});return{account:await(0,Ye.createKernelAccount)(t,{plugins:{sudo:S},index:0n,entryPoint:n.address,kernelVersion:s}),signerConfig:new _({eoaAddress:c.address,type:"eoa"})}}};var D=require("@zerodev/passkey-validator"),je=require("@zerodev/sdk"),Ge=require("@zerodev/webauthn-key");var te=class{constructor(e,t){this.passkeyServerUrl=e;this.apiKey=t}async create({user:e,publicClient:t,walletParams:n,entryPoint:a,kernelVersion:s,existingSignerConfig:o}){let i=n.signer.passkeyName??e.id;if(o!=null&&o.data.passkeyName!==i)throw new R(`User '${e.id}' has an existing wallet created with a passkey named '${o.data.passkeyName}', this does match input passkey name '${i}'.`,o.display());try{let c=await this.getPasskey(e,i,o?.data),S=D.PasskeyValidatorContractVersion.V0_0_2,g=o==null?S:o.data.validatorContractVersion,V=await(0,D.toPasskeyValidator)(t,{webAuthnKey:c,entryPoint:a.address,validatorContractVersion:g,kernelVersion:s}),pe=await(0,je.createKernelAccount)(t,{plugins:{sudo:V},entryPoint:a.address,kernelVersion:s});return{signerConfig:this.getSignerConfig(V,g,i),account:this.decorate(pe,i)}}catch(c){throw this.mapError(c,i)}}async getPasskey(e,t,n){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:(0,Ge.toWebAuthnKey)({passkeyName:t,passkeyServerUrl:this.passkeyServerUrl,mode:D.WebAuthnMode.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})}getSignerConfig(e,t,n){return new k({...At(e.getSerializedData()),passkeyName:n,validatorContractVersion:t,domain:window.location.hostname,type:"passkeys"})}createPasskeysServerHeaders(e){return{"x-api-key":this.apiKey,Authorization:`Bearer ${e.jwt}`}}mapError(e,t){return e.code===0&&e.name==="DataError"?new v(t):e.message==="Registration not verified"?new O(t):e.code==="ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY"&&e.name==="NotAllowedError"?new I(t):e}decorate(e,t){return new Proxy(e,{get:(n,a,s)=>{let o=Reflect.get(n,a,s);return typeof o!="function"||typeof a!="string"||!Tt(a)?o:async(...i)=>{try{return await o.call(n,...i)}catch(c){throw this.mapError(c,t)}}}})}},Ct=["signMessage","signTypedData","signUserOperation","signTransaction"];function Tt(r){return Ct.includes(r)}var At=r=>{let e=wt(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function wt(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}var ge=require("viem");function re(r){return!1}var bt=["sendTransaction","writeContract","sendUserOperation"],Rt=["signMessage","signTypedData"];function fe(r){return bt.includes(r)}function It(r){return Rt.includes(r)}var ne=class{constructor(e){this.errorProcessor=e}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,a,s)=>{let o=Reflect.get(n,a,s);return typeof o!="function"||typeof a!="string"||!(It(a)||fe(a))?o:(...i)=>E(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,o,i,e))}})}async execute(e,t,n,a,s){try{w(`[CrossmintSmartWallet.${t}] - params: ${(0,ge.stringify)(a)}`);let o=fe(t)?this.processTxnArgs(t,s,a):a;return await n.call(e,...o)}catch(o){let i=fe(t)?"signing":"sending transaction";throw this.errorProcessor.map(o,new l(`Error ${i}: ${o.message}`,(0,ge.stringify)(o)))}}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:s,middleware:o,account:i}]=n;return[{middleware:o,account:i,userOperation:this.addGelatoBundlerProperties(t,s)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(t,a),...n.slice(1)]}addGelatoBundlerProperties(e,t){return re(e)?{...t,maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}:t}};var Ze=require("@zerodev/sdk"),oe=require("permissionless"),U=require("viem"),Qe=require("@crossmint/common-sdk-base");var d=require("viem/chains"),f=require("@crossmint/common-sdk-base");var Je={BASE_SEPOLIA:f.BlockchainIncludingTestnet.BASE_SEPOLIA,POLYGON_AMOY:f.BlockchainIncludingTestnet.POLYGON_AMOY,OPTIMISM_SEPOLIA:f.BlockchainIncludingTestnet.OPTIMISM_SEPOLIA,ARBITRUM_SEPOLIA:f.BlockchainIncludingTestnet.ARBITRUM_SEPOLIA},Hr=(0,f.objectValues)(Je),He={BASE:f.BlockchainIncludingTestnet.BASE,POLYGON:f.BlockchainIncludingTestnet.POLYGON,OPTIMISM:f.BlockchainIncludingTestnet.OPTIMISM,ARBITRUM:f.BlockchainIncludingTestnet.ARBITRUM},zr=(0,f.objectValues)(He),Ot={...Je,...He},qr=(0,f.objectValues)(Ot),vt={polygon:"5c9f4865-ca8e-44bb-9b9e-3810b2b46f9f","polygon-amoy":"3deef404-ca06-4a5d-9a58-907c99e7ef00","base-sepolia":"5a127978-6473-4784-9dfb-f74395b220a6",base:"e8b3020f-4dde-4176-8a7d-be8102527a5c","optimism-sepolia":"f8dd488e-eaed-467d-a5de-0184c160f3b1",optimism:"505950ab-ee07-4a9c-bd16-320ac71a9350",arbitrum:"a965100f-fedf-4e6b-a207-20f5687fcc4f","arbitrum-sepolia":"76c860ca-af77-4fb1-8eac-07825952f6f4"},ze={polygon:d.polygon,"polygon-amoy":d.polygonAmoy,base:d.base,"base-sepolia":d.baseSepolia,optimism:d.optimism,"optimism-sepolia":d.optimismSepolia,arbitrum:d.arbitrum,"arbitrum-sepolia":d.arbitrumSepolia},Se=r=>be+vt[r];function qe(r){return!re(r)}function Xe({entryPoint:r,chain:e,walletService:t,user:n}){return{middleware:{sponsorUserOperation:async({userOperation:a})=>{let{sponsorUserOpParams:s}=await t.sponsorUserOperation(n,a,r,e);return s}}}}var ae=class{constructor(e,t,n,a){this.crossmintService=e;this.accountConfigFacade=t;this.accountCreator=n;this.clientDecorator=a}async getOrCreate(e,t,n){let{entryPointVersion:a,kernelVersion:s,existingSignerConfig:o,smartContractWalletAddress:i,userId:c}=await this.accountConfigFacade.get(e,t),S=(0,U.createPublicClient)({transport:(0,U.http)(Se(t))}),{account:g,signerConfig:V}=await this.accountCreator.get({chain:t,walletParams:n,publicClient:S,user:{...e,id:c},entryPoint:{version:a,address:a==="v0.6"?oe.ENTRYPOINT_ADDRESS_V06:oe.ENTRYPOINT_ADDRESS_V07},kernelVersion:s,existingSignerConfig:o});if(i!=null&&!$(i,g.address))throw new h(c);o==null&&await this.crossmintService.idempotentCreateSmartWallet(e,{type:Pe,smartContractWalletAddress:g.address,signerData:V.data,version:0,baseLayer:"evm",chainId:(0,Qe.blockchainToChainId)(t),entryPointVersion:a,kernelVersion:s});let pe=(0,Ze.createKernelAccountClient)({account:g,chain:ze[t],entryPoint:g.entryPoint,bundlerTransport:(0,U.http)(Se(t)),...qe(t)&&Xe({entryPoint:g.entryPoint,chain:t,walletService:this.crossmintService,user:e})}),rt=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:pe});return new b(this.crossmintService,rt,S,t)}};var ie=require("viem");var se=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof l||e instanceof ie.BaseError?e:t}record(e){let t=e instanceof Error?e.message:String(e);this.logger.logError(`Smart Wallet SDK Error: ${t}`,{stack:e instanceof Error?e.stack:void 0,name:e instanceof Error?e.name:"UnknownError",details:(0,ie.stringify)(e),domain:window.location.hostname,sdk_version:we})}};var le=class r{constructor(e,t){this.smartWalletService=e;this.errorProcessor=t}static init({clientApiKey:e}){if(!L())throw new l("Smart Wallet SDK should only be used client side.");if(!(0,tt.validateAPIKey)(e).isValid)throw new Error("API key invalid");let n=new X(e),a=new se(new A),s=new Q(new ee,new te(n.getPasskeyServerUrl(),e)),o=new ae(n,new Z(n),s,new ne(a));return new r(o,a)}async getOrCreateWallet(e,t,n={signer:{type:"PASSKEY"}}){return E("GET_OR_CREATE_WALLET",async()=>{try{return await this.smartWalletService.getOrCreate(e,t,n)}catch(a){throw this.errorProcessor.map(a,new l(`Wallet creation failed: ${a.message}.`,(0,et.stringify)(a)))}})}};0&&(module.exports={AdminAlreadyUsedError,AdminMismatchError,Chain,ConfigError,CrossmintSDKError,CrossmintServiceError,EVMSmartWallet,JWTDecryptionError,JWTExpiredError,JWTIdentifierError,JWTInvalidError,NotAuthorizedError,PasskeyIncompatibleAuthenticatorError,PasskeyMismatchError,PasskeyPromptError,PasskeyRegistrationError,SmartWalletError,SmartWalletErrorCode,SmartWalletSDK,SmartWalletsNotEnabledError,TransferError,UserWalletAlreadyCreatedError,blockchainToChainId});
1
+ "use strict";var ye=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var lt=Object.prototype.hasOwnProperty;var ct=(r,e)=>{for(var t in e)ye(r,t,{get:e[t],enumerable:!0})},pt=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of it(e))!lt.call(r,a)&&a!==t&&ye(r,a,{get:()=>e[a],enumerable:!(n=st(e,a))||n.enumerable});return r};var mt=r=>pt(ye({},"__esModule",{value:!0}),r);var Nt={};ct(Nt,{AdminAlreadyUsedError:()=>W,AdminMismatchError:()=>h,Chain:()=>de.EVMBlockchainIncludingTestnet,ConfigError:()=>P,CrossmintSDKError:()=>m.CrossmintSDKError,CrossmintServiceError:()=>m.CrossmintServiceError,EVMSmartWallet:()=>w,JWTDecryptionError:()=>m.JWTDecryptionError,JWTExpiredError:()=>m.JWTExpiredError,JWTIdentifierError:()=>m.JWTIdentifierError,JWTInvalidError:()=>m.JWTInvalidError,NotAuthorizedError:()=>m.NotAuthorizedError,PasskeyIncompatibleAuthenticatorError:()=>v,PasskeyMismatchError:()=>b,PasskeyPromptError:()=>I,PasskeyRegistrationError:()=>x,SmartWalletError:()=>l,SmartWalletErrorCode:()=>m.SmartWalletErrorCode,SmartWalletSDK:()=>me,SmartWalletsNotEnabledError:()=>O,TransferError:()=>m.TransferError,UserWalletAlreadyCreatedError:()=>R,blockchainToChainId:()=>de.blockchainToChainId});module.exports=mt(Nt);var de=require("@crossmint/common-sdk-base");var U=require("viem"),_e=require("@crossmint/client-sdk-base");function L(){return typeof window<"u"}function Ae(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function Te(r,e){return r?.toLowerCase()===e?.toLowerCase()}var $=class{logInfo(e,t){console.log(e,t)}logError(e,t){console.error(e,t)}logWarn(e,t){console.warn(e,t)}};var j=require("@datadog/browser-logs");var we="ZeroDev";var be="pub035be8a594b35be1887b6ba76c4029ca",Re="http://localhost:3000/api",Ie="https://staging.crossmint.com/api",xe="https://www.crossmint.com/api",C="SCW_SDK",K="0.1.0",B="2024-06-09",ve="https://rpc.zerodev.app/api/v2/bundler/";var fe=["0.3.1","0.3.0","0.2.4"],ge=["v0.6","v0.7"];var A=class{logInfo(e,t){Se(e,"info",t)}logError(e,t){Se(e,"error",t)}logWarn(e,t){Se(e,"warn",t)}};function Se(r,e,t){let n=t?{...t,service:C}:{service:C};dt(),j.datadogLogs.logger[e](r,n)}function dt(){j.datadogLogs.getInternalContext()==null&&j.datadogLogs.init({clientToken:be,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function ut(){return L()&&Ae()?new $:new A}var{logInfo:T,logWarn:Jt,logError:F}=ut();async function E(r,e,t){let n=new Date().getTime(),a=await e(),o={durationInMs:new Date().getTime()-n,...t};return T(`[${C} - ${r} - TIME] - ${yt(o)}`,{args:o}),a}function yt(r){try{return r!=null?JSON.stringify(r,null,2):r}catch{return ft(r)}}function ft(r){let e={};for(let t in r)Object.prototype.hasOwnProperty.call(r,t)&&typeof r[t]!="object"&&typeof r[t]!="function"&&(e[t]=r[t]);return JSON.stringify(e,null,2)}function We(r){let e=r instanceof Error?r:{message:"Unknown error",name:"Unknown error"};if(!(e instanceof Error)&&e.constructor?.name!=="SyntheticBaseEvent")throw F("ERROR_TO_JSON_FAILED",{error:e}),new Error("[errorToJSON] err is not instanceof Error nor SyntheticBaseEvent");return JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}var Y=require("viem");var Oe=[{inputs:[{internalType:"string",name:"uri_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[]",name:"ids",type:"uint256[]"},{indexed:!1,internalType:"uint256[]",name:"values",type:"uint256[]"}],name:"TransferBatch",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"id",type:"uint256"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"TransferSingle",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"string",name:"value",type:"string"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"URI",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"id",type:"uint256"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address[]",name:"accounts",type:"address[]"},{internalType:"uint256[]",name:"ids",type:"uint256[]"}],name:"balanceOfBatch",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256[]",name:"ids",type:"uint256[]"},{internalType:"uint256[]",name:"amounts",type:"uint256[]"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeBatchTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"uri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"}];function ke({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:Y.erc20Abi,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:Oe,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:Y.erc721Abi,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var w=class{constructor(e,t,n,a){this.crossmintService=e;this.accountClient=t;this.chain=a,this.client={wallet:t,public:n}}get address(){return this.accountClient.account.address}async transferToken(e,t){return E("TRANSFER",async()=>{if(this.chain!==t.token.chain)throw new Error(`Chain mismatch: Expected ${t.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`);if(!(0,U.isAddress)(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!(0,U.isAddress)(t.token.contractAddress))throw new Error(`Invalid contract address: '${t.token.contractAddress}' is not a valid EVM address.`);let n=ke({contract:t.token.contractAddress,to:e,from:this.accountClient.account,config:t});try{let a=this.accountClient.extend(U.publicActions),{request:s}=await a.simulateContract(n),o=await a.writeContract(s);return T(`[TRANSFER] - Transaction hash from transfer: ${o}`),o}catch(a){F("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:C,error:We(a),tokenId:n.tokenId,contractAddress:t.token.contractAddress,chain:t.token.chain});let s=n.tokenId==null?"":`:${n.tokenId}}`;throw new _e.TransferError(`Error transferring token ${t.token.contractAddress}${s}`)}},{toAddress:e,config:t})}async nfts(){return this.crossmintService.fetchNFTs(this.address,this.chain)}};var y=require("@crossmint/client-sdk-base"),l=class extends y.CrossmintSDKError{constructor(e,t,n=y.SmartWalletErrorCode.UNCATEGORIZED){super(e,n,t)}},h=class extends l{constructor(e,t,n){super(e,y.SmartWalletErrorCode.ADMIN_MISMATCH),this.required=t,this.used=n}},b=class extends l{constructor(e,t,n){super(e,y.SmartWalletErrorCode.PASSKEY_MISMATCH),this.required=t,this.used=n}},R=class extends l{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=y.SmartWalletErrorCode.USER_WALLET_ALREADY_CREATED}},I=class extends l{constructor(e){super(`Prompt was either cancelled or timed out for passkey ${e}`,void 0,y.SmartWalletErrorCode.PASSKEY_PROMPT),this.passkeyName=e}},x=class extends l{constructor(e){super(`Registration for passkey ${e} failed, either the registration took too long, or passkey signature vaildation failed.`,void 0,y.SmartWalletErrorCode.PASSKEY_REGISTRATION),this.passkeyName=e}},v=class extends l{constructor(e){super(`User selected authenticator for passkey ${e} is not compatible with Crossmint's Smart Wallets.`,void 0,y.SmartWalletErrorCode.PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=e}},P=class extends l{constructor(e){super(e,void 0,y.SmartWalletErrorCode.WALLET_CONFIG)}},W=class extends P{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=y.SmartWalletErrorCode.ADMIN_SIGNER_ALREADY_USED}},O=class extends P{constructor(){super("Smart wallets are not enabled for this project. They can be enabled on the project settings page in the developer console.");this.code=y.SmartWalletErrorCode.SMART_WALLETS_NOT_ENABLED}};var m=require("@crossmint/client-sdk-base");var nt=require("viem"),at=require("@crossmint/common-sdk-base");var $e=require("@crossmint/client-sdk-base"),Ke=require("@crossmint/common-sdk-base");var De=require("@crossmint/client-sdk-base"),Ne=require("@crossmint/common-sdk-base");var u=require("@crossmint/client-sdk-base");var G=class{constructor(e={ERROR_JWT_INVALID:()=>new u.JWTInvalidError,ERROR_JWT_DECRYPTION:()=>new u.JWTDecryptionError,ERROR_JWT_EXPIRED:({expiredAt:t})=>new u.JWTExpiredError(new Date(t)),ERROR_JWT_IDENTIFIER:({identifierKey:t})=>new u.JWTIdentifierError(t),ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new R(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new W,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new O}){this.errors=e}async throwErrorFromResponse({response:e,onServerErrorMessage:t}){if(!e.ok){if(e.status>=500)throw new u.CrossmintServiceError(t,e.status);if(e.status===402)throw new u.OutOfCreditsError;try{let n=await e.json(),a=n.code;if(a!=null&&this.errors[a]!=null)throw this.errors[a](n);if(n.message!=null)throw new u.CrossmintServiceError(n.message,e.status)}catch(n){if(n instanceof l)throw n;console.error("Error parsing response",n)}throw new u.CrossmintServiceError(await e.text(),e.status)}}};var M=class M{constructor(e){let t=(0,Ne.validateAPIKey)(e);if(!t.isValid)throw new Error("API key invalid");this.crossmintAPIHeaders={accept:"application/json","content-type":"application/json","x-api-key":e},this.crossmintBaseUrl=this.getUrlFromEnv(t.environment),this.apiErrorService=new G}async fetchCrossmintAPI(e,t={method:"GET"},n,a){return E("FETCH_CROSSMINT_API",async()=>{let s=`${this.crossmintBaseUrl}/${e}`,{body:o,method:i}=t,c;try{c=await fetch(s,{body:o,method:i,headers:{...this.crossmintAPIHeaders,...a!=null&&{Authorization:`Bearer ${a}`}}})}catch(g){throw new De.CrossmintServiceError(`Error fetching Crossmint API: ${g}`)}return c.ok||await this.apiErrorService.throwErrorFromResponse({response:c,onServerErrorMessage:n}),await c.json()},{endpoint:e})}getUrlFromEnv(e){let t=M.urlMap[e];if(!t)throw console.log(" CrossmintService.urlMap: ",M.urlMap),new Error(`URL not found for environment: ${e}`);return t}};M.urlMap={development:Re,staging:Ie,production:xe};var J=M;var Ue=require("@zerodev/passkey-validator"),z=require("viem"),p=require("zod");var St=p.z.custom(r=>(0,z.isHex)(r),{message:"Invalid hex string"}),H=p.z.custom(r=>(0,z.isAddress)(r),{message:"Invalid evm address"}),Et=p.z.object({eoaAddress:H,type:p.z.literal("eoa")}),ht=p.z.object({entryPoint:H,validatorAddress:H,pubKeyX:p.z.string(),pubKeyY:p.z.string(),authenticatorIdHash:St,authenticatorId:p.z.string()}),Pt=ht.extend({passkeyName:p.z.string(),validatorContractVersion:p.z.nativeEnum(Ue.PasskeyValidatorContractVersion),domain:p.z.string(),type:p.z.literal("passkeys")}),Ct=p.z.discriminatedUnion("type",[Pt,Et]),q=p.z.object({kernelVersion:p.z.enum(fe,{errorMap:(r,e)=>({message:`Unsupported kernel version. Supported versions: ${fe.join(", ")}. Version used: ${e.data}. Please contact support`})}),entryPointVersion:p.z.enum(ge,{errorMap:(r,e)=>({message:`Unsupported entry point version. Supported versions: ${ge.join(", ")}. Version used: ${e.data}. Please contact support`})}),userId:p.z.string().min(1),signers:p.z.array(p.z.object({signerData:Ct})).min(0).max(1,"Invalid wallet signer configuration. Please contact support"),smartContractWalletAddress:H.optional()});var Me=require("viem");function X(r,e){let t=e(r);return t.replace?t.value:Array.isArray(r)?r.map(n=>X(n,e)):r!==null&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([n,a])=>[n,X(a,e)])):t.value}function Ve(r){return X(r,e=>typeof e=="bigint"?{value:(0,Me.toHex)(e),replace:!0}:{value:e,replace:!1})}function Le(r){return X(r,e=>e!=null&&typeof e=="object"&&"__xm_serializedType"in e&&"value"in e&&e.__xm_serializedType==="bigint"&&typeof e.value=="string"?{value:BigInt(e.value),replace:!0}:{value:e,replace:!1})}var Z=class extends J{async idempotentCreateSmartWallet(e,t){await this.fetchCrossmintAPI(`${B}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(t)},"Error creating abstract wallet. Please contact support",e.jwt)}async sponsorUserOperation(e,t,n,a){let s=(0,Ke.blockchainToChainId)(a),o=await this.fetchCrossmintAPI(`${B}/sdk/paymaster`,{method:"POST",body:JSON.stringify({userOp:Ve(t),entryPoint:n,chainId:s})},"Error sponsoring user operation. Please contact support",e.jwt);return Le(o)}async getSmartWalletConfig(e,t){let n=await this.fetchCrossmintAPI(`${B}/sdk/smart-wallet/config?chain=${t}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",e.jwt),a=q.safeParse(n);if(!a.success)throw new $e.CrossmintServiceError(`Invalid smart wallet config, please contact support. Details below:
2
+ ${a.error.toString()}`);return a.data}async fetchNFTs(e,t){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${t}:${e}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${e}`)}getPasskeyServerUrl(){return this.crossmintBaseUrl+"/internal/passkeys"}};var ee=require("viem");var Q=class{constructor(e){this.keyPrefix=e}set(e,t){localStorage.setItem(this.key(e),JSON.stringify(t))}get(e){let t=this.key(e),n=localStorage.getItem(t);if(n==null)return null;let a=q.safeParse(JSON.parse(n));return a.success?a.data:(localStorage.removeItem(t),null)}clear(){for(let e=0;e<localStorage.length;e++){let t=localStorage.key(e);t&&t.startsWith(this.keyPrefix)&&(localStorage.removeItem(t),e--)}}key(e){return`${this.keyPrefix}-${(0,ee.keccak256)((0,ee.toHex)(e.jwt))}`}};var k=class{constructor(e){this.type="passkeys";this.data=e}display(){return{pubKeyX:this.data.pubKeyX,pubKeyY:this.data.pubKeyY,passkeyName:this.data.passkeyName,type:this.type}}},_=class{constructor(e){this.type="eoa";this.data=e}display(){return this.data}};var te=class{constructor(e,t){this.crossmintService=e;this.configCache=t}async get(e,t){let n=this.configCache.get(e);if(n!=null)return{config:this.validateAndFormat(e,n),cached:!0};let a=await this.crossmintService.getSmartWalletConfig(e,t);return{config:this.validateAndFormat(e,a),cached:!1}}cache({entryPointVersion:e,kernelVersion:t,user:n,existing:a}){this.configCache.clear(),this.configCache.set(n,{entryPointVersion:e,kernelVersion:t,userId:n.id,signers:[{signerData:a.signerConfig.data}],smartContractWalletAddress:a.address})}validateAndFormat(e,{entryPointVersion:t,kernelVersion:n,signers:a,smartContractWalletAddress:s,userId:o}){if(t==="v0.7"&&n.startsWith("0.2")||t==="v0.6"&&n.startsWith("0.3"))throw new l(`Unsupported combination: entryPoint ${t} and kernel version ${n}. Please contact support`);let i=a.map(g=>g.signerData),c=this.getSigner(i);if(s!=null&&c==null||c!=null&&s==null)throw new l("Either both signer and address must be present, or both must be null");return c==null||s==null?{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:o}}:{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:o},existing:{signerConfig:c,address:s}}}getSigner(e){if(e.length===0)return;let t=e[0];if(t.type==="eoa")return new _(t);if(t.type==="passkeys")return new k(t)}};function Ee(r){return"signer"in r&&"type"in r.signer&&r.signer.type==="PASSKEY"}function Be(r){let e=r.existing==null||r.existing.signerConfig.type==="passkeys";return Ee(r.walletParams)&&e}function At(r){return"signer"in r&&("type"in r.signer&&r.signer.type==="VIEM_ACCOUNT"||"request"in r.signer&&typeof r.signer.request=="function")}function je(r){let e=r.existing==null||r.existing.signerConfig.type==="eoa";return At(r.walletParams)&&e}var re=class{constructor(e,t){this.eoaStrategy=e;this.passkeyStrategy=t}get(e){if(Be(e))return this.passkeyStrategy.create(e);if(je(e))return this.eoaStrategy.create(e);if(e.existing==null)throw new P(`Unsupported wallet params:
3
+ ${e.walletParams}`);let t=e.existing.signerConfig.display(),n=Ee(e.walletParams)?"passkey":"eoa";throw new h(`Cannot create wallet with ${n} signer for user ${e.user.id}', they already have a wallet with signer:
4
+ '${JSON.stringify(t,null,2)}'`,t)}};var Ge=require("@zerodev/ecdsa-validator"),Je=require("@zerodev/sdk");var Fe=require("permissionless");async function Ye({walletParams:r}){if(Tt(r.signer))return await(0,Fe.providerToSmartAccountSigner)(r.signer);if(wt(r.signer))return r.signer.account;{let e=r.signer;throw new l(`The signer type ${e.type} is not supported`)}}function Tt(r){return r&&typeof r.request=="function"}function wt(r){return r&&r.type==="VIEM_ACCOUNT"}var ne=class{async create({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:s,user:o,existing:i}){let c=await Ye({chain:e,walletParams:a});if(i!=null&&!Te(c.address,i.signerConfig.data.eoaAddress))throw new h(`User '${o.id}' has an existing wallet with an eoa signer '${i.signerConfig.data.eoaAddress}', this does not match input eoa signer '${c.address}'.`,i.signerConfig.display(),{type:"eoa",eoaAddress:i.signerConfig.data.eoaAddress});let g=await(0,Ge.signerToEcdsaValidator)(t,{signer:c,entryPoint:n,kernelVersion:s});return{account:await(0,Je.createKernelAccount)(t,{plugins:{sudo:g},index:0n,entryPoint:n,kernelVersion:s,deployedAccountAddress:i?.address}),signerConfig:new _({eoaAddress:c.address,type:"eoa"})}}};var D=require("@zerodev/passkey-validator"),He=require("@zerodev/sdk"),ze=require("@zerodev/webauthn-key");var ae=class{constructor(e,t){this.passkeyServerUrl=e;this.apiKey=t}async create({user:e,publicClient:t,walletParams:n,entryPoint:a,kernelVersion:s,existing:o}){let i=n.signer.passkeyName??e.id;if(o!=null&&o.signerConfig.data.passkeyName!==i)throw new b(`User '${e.id}' has an existing wallet created with a passkey named '${o.signerConfig.data.passkeyName}', this does match input passkey name '${i}'.`,o.signerConfig.display());try{let c=await this.getPasskey(e,i,o?.signerConfig.data),g=D.PasskeyValidatorContractVersion.V0_0_2,S=o==null?g:o.signerConfig.data.validatorContractVersion,N=await(0,D.toPasskeyValidator)(t,{webAuthnKey:c,entryPoint:a,validatorContractVersion:S,kernelVersion:s}),ue=await(0,He.createKernelAccount)(t,{plugins:{sudo:N},entryPoint:a,kernelVersion:s,deployedAccountAddress:o?.address});return{signerConfig:this.getSignerConfig(N,S,i),account:this.decorate(ue,i)}}catch(c){throw this.mapError(c,i)}}async getPasskey(e,t,n){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:(0,ze.toWebAuthnKey)({passkeyName:t,passkeyServerUrl:this.passkeyServerUrl,mode:D.WebAuthnMode.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})}getSignerConfig(e,t,n){return new k({...It(e.getSerializedData()),passkeyName:n,validatorContractVersion:t,domain:window.location.hostname,type:"passkeys"})}createPasskeysServerHeaders(e){return{"x-api-key":this.apiKey,Authorization:`Bearer ${e.jwt}`}}mapError(e,t){return e.code===0&&e.name==="DataError"?new v(t):e.message==="Registration not verified"?new x(t):e.code==="ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY"&&e.name==="NotAllowedError"?new I(t):e}decorate(e,t){return new Proxy(e,{get:(n,a,s)=>{let o=Reflect.get(n,a,s);return typeof o!="function"||typeof a!="string"||!Rt(a)?o:async(...i)=>{try{return await o.call(n,...i)}catch(c){throw this.mapError(c,t)}}}})}},bt=["signMessage","signTypedData","signUserOperation","signTransaction"];function Rt(r){return bt.includes(r)}var It=r=>{let e=xt(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function xt(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}var Pe=require("viem");function oe(r){return!1}var vt=["sendTransaction","writeContract","sendUserOperation"],Wt=["signMessage","signTypedData"];function he(r){return vt.includes(r)}function Ot(r){return Wt.includes(r)}var se=class{constructor(e){this.errorProcessor=e}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,a,s)=>{let o=Reflect.get(n,a,s);return typeof o!="function"||typeof a!="string"||!(Ot(a)||he(a))?o:(...i)=>E(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,o,i,e))}})}async execute(e,t,n,a,s){try{T(`[CrossmintSmartWallet.${t}] - params: ${(0,Pe.stringify)(a)}`);let o=he(t)?this.processTxnArgs(t,s,a):a;return await n.call(e,...o)}catch(o){let i=he(t)?"signing":"sending transaction";throw this.errorProcessor.map(o,new l(`Error ${i}: ${o.message}`,(0,Pe.stringify)(o)))}}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:s,middleware:o,account:i}]=n;return[{middleware:o,account:i,userOperation:this.addGelatoBundlerProperties(t,s)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(t,a),...n.slice(1)]}addGelatoBundlerProperties(e,t){return oe(e)?{...t,maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}:t}};var tt=require("@zerodev/sdk"),le=require("permissionless"),V=require("viem"),rt=require("@crossmint/common-sdk-base");var d=require("viem/chains"),f=require("@crossmint/common-sdk-base");var qe={BASE_SEPOLIA:f.BlockchainIncludingTestnet.BASE_SEPOLIA,POLYGON_AMOY:f.BlockchainIncludingTestnet.POLYGON_AMOY,OPTIMISM_SEPOLIA:f.BlockchainIncludingTestnet.OPTIMISM_SEPOLIA,ARBITRUM_SEPOLIA:f.BlockchainIncludingTestnet.ARBITRUM_SEPOLIA},Qr=(0,f.objectValues)(qe),Xe={BASE:f.BlockchainIncludingTestnet.BASE,POLYGON:f.BlockchainIncludingTestnet.POLYGON,OPTIMISM:f.BlockchainIncludingTestnet.OPTIMISM,ARBITRUM:f.BlockchainIncludingTestnet.ARBITRUM},en=(0,f.objectValues)(Xe),kt={...qe,...Xe},tn=(0,f.objectValues)(kt),_t={polygon:"5c9f4865-ca8e-44bb-9b9e-3810b2b46f9f","polygon-amoy":"3deef404-ca06-4a5d-9a58-907c99e7ef00","base-sepolia":"5a127978-6473-4784-9dfb-f74395b220a6",base:"e8b3020f-4dde-4176-8a7d-be8102527a5c","optimism-sepolia":"f8dd488e-eaed-467d-a5de-0184c160f3b1",optimism:"505950ab-ee07-4a9c-bd16-320ac71a9350",arbitrum:"a965100f-fedf-4e6b-a207-20f5687fcc4f","arbitrum-sepolia":"76c860ca-af77-4fb1-8eac-07825952f6f4"},Ze={polygon:d.polygon,"polygon-amoy":d.polygonAmoy,base:d.base,"base-sepolia":d.baseSepolia,optimism:d.optimism,"optimism-sepolia":d.optimismSepolia,arbitrum:d.arbitrum,"arbitrum-sepolia":d.arbitrumSepolia},Ce=r=>ve+_t[r];function Qe(r){return!oe(r)}function et({entryPoint:r,chain:e,walletService:t,user:n}){return{middleware:{sponsorUserOperation:async({userOperation:a})=>{let{sponsorUserOpParams:s}=await t.sponsorUserOperation(n,a,r,e);return s}}}}var ie=class{constructor(e,t,n,a){this.crossmintService=e;this.accountConfigService=t;this.accountCreator=n;this.clientDecorator=a}async getOrCreate(e,t,n){let{config:{entryPointVersion:a,kernelVersion:s,existing:o,userWithId:i},cached:c}=await this.accountConfigService.get(e,t),g=(0,V.createPublicClient)({transport:(0,V.http)(Ce(t))}),{account:S,signerConfig:N}=await this.accountCreator.get({chain:t,walletParams:n,publicClient:g,user:i,entryPoint:a==="v0.6"?le.ENTRYPOINT_ADDRESS_V06:le.ENTRYPOINT_ADDRESS_V07,kernelVersion:s,existing:o});o==null&&await this.crossmintService.idempotentCreateSmartWallet(e,{type:we,smartContractWalletAddress:S.address,signerData:N.data,version:0,baseLayer:"evm",chainId:(0,rt.blockchainToChainId)(t),entryPointVersion:a,kernelVersion:s}),c||this.accountConfigService.cache({entryPointVersion:a,kernelVersion:s,user:i,existing:{address:S.address,signerConfig:N}});let ue=(0,tt.createKernelAccountClient)({account:S,chain:Ze[t],entryPoint:S.entryPoint,bundlerTransport:(0,V.http)(Ce(t)),...Qe(t)&&et({entryPoint:S.entryPoint,chain:t,walletService:this.crossmintService,user:e})}),ot=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:ue});return new w(this.crossmintService,ot,g,t)}};var pe=require("viem");var ce=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof l||e instanceof pe.BaseError?e:t}record(e){let t=e instanceof Error?e.message:String(e);this.logger.logError(`Smart Wallet SDK Error: ${t}`,{stack:e instanceof Error?e.stack:void 0,name:e instanceof Error?e.name:"UnknownError",details:(0,pe.stringify)(e),domain:window.location.hostname,sdk_version:K})}};var me=class r{constructor(e,t){this.smartWalletService=e;this.errorProcessor=t}static init({clientApiKey:e}){if(!L())throw new l("Smart Wallet SDK should only be used client side.");if(!(0,at.validateAPIKey)(e).isValid)throw new Error("API key invalid");let n=new Z(e),a=new ce(new A),s=new re(new ne,new ae(n.getPasskeyServerUrl(),e)),o=new Q(`smart-wallet-${K}`),i=new ie(n,new te(n,o),s,new se(a));return new r(i,a)}async getOrCreateWallet(e,t,n={signer:{type:"PASSKEY"}}){return E("GET_OR_CREATE_WALLET",async()=>{try{return await this.smartWalletService.getOrCreate(e,t,n)}catch(a){throw this.errorProcessor.map(a,new l(`Wallet creation failed: ${a.message}.`,(0,nt.stringify)(a)))}})}};0&&(module.exports={AdminAlreadyUsedError,AdminMismatchError,Chain,ConfigError,CrossmintSDKError,CrossmintServiceError,EVMSmartWallet,JWTDecryptionError,JWTExpiredError,JWTIdentifierError,JWTInvalidError,NotAuthorizedError,PasskeyIncompatibleAuthenticatorError,PasskeyMismatchError,PasskeyPromptError,PasskeyRegistrationError,SmartWalletError,SmartWalletErrorCode,SmartWalletSDK,SmartWalletsNotEnabledError,TransferError,UserWalletAlreadyCreatedError,blockchainToChainId});
5
5
  //# sourceMappingURL=index.cjs.map