@crossmint/client-sdk-smart-wallet 0.1.8 → 0.1.10

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 oe=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var He=Object.prototype.hasOwnProperty;var ze=(r,e)=>{for(var t in e)oe(r,t,{get:e[t],enumerable:!0})},qe=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Fe(e))!He.call(r,a)&&a!==t&&oe(r,a,{get:()=>e[a],enumerable:!(n=je(e,a))||n.enumerable});return r};var Je=r=>qe(oe({},"__esModule",{value:!0}),r);var ht={};ze(ht,{AdminAlreadyUsedError:()=>w,AdminMismatchError:()=>h,Chain:()=>ae.EVMBlockchainIncludingTestnet,ConfigError:()=>P,CrossmintSDKError:()=>c.CrossmintSDKError,CrossmintServiceError:()=>c.CrossmintServiceError,EVMSmartWallet:()=>C,JWTDecryptionError:()=>c.JWTDecryptionError,JWTExpiredError:()=>c.JWTExpiredError,JWTIdentifierError:()=>c.JWTIdentifierError,JWTInvalidError:()=>c.JWTInvalidError,NotAuthorizedError:()=>c.NotAuthorizedError,PasskeyIncompatibleAuthenticatorError:()=>x,PasskeyMismatchError:()=>E,PasskeyPromptError:()=>T,PasskeyRegistrationError:()=>b,SmartWalletError:()=>l,SmartWalletErrorCode:()=>c.SmartWalletErrorCode,SmartWalletSDK:()=>ne,SmartWalletsNotEnabledError:()=>W,TransferError:()=>c.TransferError,UserWalletAlreadyCreatedError:()=>A,blockchainToChainId:()=>ae.blockchainToChainId});module.exports=Je(ht);var ae=require("@crossmint/common-sdk-base");var D=require("viem"),Se=require("@crossmint/client-sdk-base");var _=require("@crossmint/client-sdk-base");var de="ZeroDev";var U="SCW_SDK",M="0.1.0",V="2024-06-09",ue="https://rpc.zerodev.app/api/v2/bundler/";var ie=["0.3.1","0.3.0","0.2.4"],le=["v0.6","v0.7"];var S=new _.SDKLogger(U),ye=new _.SDKLogger(U,(0,_.getBrowserLogger)(U,{onlyDatadog:!0}));var L=require("viem");var ge=[{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 fe({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:L.erc20Abi,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:ge,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:L.erc721Abi,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var C=class{constructor(e,t,n,a,o=S){this.crossmintService=e;this.accountClient=t;this.logger=o;this.chain=a,this.client={wallet:t,public:n}}get address(){return this.accountClient.account.address}async transferToken(e,t){return this.logger.logPerformance("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,D.isAddress)(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!(0,D.isAddress)(t.token.contractAddress))throw new Error(`Invalid contract address: '${t.token.contractAddress}' is not a valid EVM address.`);let n=fe({contract:t.token.contractAddress,to:e,from:this.accountClient.account,config:t});try{let a=this.accountClient.extend(D.publicActions),{request:o}=await a.simulateContract(n),s=await a.writeContract(o);return this.logger.log(`[TRANSFER] - Transaction hash from transfer: ${s}`),s}catch(a){this.logger.error("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{error:a instanceof Error?a.message:JSON.stringify(a),tokenId:n.tokenId,contractAddress:t.token.contractAddress,chain:t.token.chain});let o=n.tokenId==null?"":`:${n.tokenId}}`;throw new Se.TransferError(`Error transferring token ${t.token.contractAddress}${o}`)}},{toAddress:e,config:t})}async nfts(){return this.crossmintService.fetchNFTs(this.address,this.chain)}};var u=require("@crossmint/client-sdk-base"),l=class extends u.CrossmintSDKError{constructor(e,t,n=u.SmartWalletErrorCode.UNCATEGORIZED){super(e,n,t)}},h=class extends l{constructor(e,t,n){super(e,u.SmartWalletErrorCode.ADMIN_MISMATCH),this.required=t,this.used=n}},E=class extends l{constructor(e,t,n){super(e,u.SmartWalletErrorCode.PASSKEY_MISMATCH),this.required=t,this.used=n}},A=class extends l{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=u.SmartWalletErrorCode.USER_WALLET_ALREADY_CREATED}},T=class extends l{constructor(e){super(`Prompt was either cancelled or timed out for passkey ${e}`,void 0,u.SmartWalletErrorCode.PASSKEY_PROMPT),this.passkeyName=e}},b=class extends l{constructor(e){super(`Registration for passkey ${e} failed, either the registration took too long, or passkey signature vaildation failed.`,void 0,u.SmartWalletErrorCode.PASSKEY_REGISTRATION),this.passkeyName=e}},x=class extends l{constructor(e){super(`User selected authenticator for passkey ${e} is not compatible with Crossmint's Smart Wallets.`,void 0,u.SmartWalletErrorCode.PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=e}},P=class extends l{constructor(e){super(e,void 0,u.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=u.SmartWalletErrorCode.ADMIN_SIGNER_ALREADY_USED}},W=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=u.SmartWalletErrorCode.SMART_WALLETS_NOT_ENABLED}};var c=require("@crossmint/client-sdk-base");var Be=require("viem"),Ye=require("@crossmint/common-sdk-base");var v=require("@crossmint/client-sdk-base"),Ae=require("@crossmint/common-sdk-base");var he=require("@zerodev/passkey-validator"),$=require("viem"),p=require("zod");var Ze=p.z.custom(r=>(0,$.isHex)(r),{message:"Invalid hex string"}),K=p.z.custom(r=>(0,$.isAddress)(r),{message:"Invalid evm address"}),Qe=p.z.object({eoaAddress:K,type:p.z.literal("eoa")}),et=p.z.object({entryPoint:K,validatorAddress:K,pubKeyX:p.z.string(),pubKeyY:p.z.string(),authenticatorIdHash:Ze,authenticatorId:p.z.string()}),tt=et.extend({passkeyName:p.z.string(),validatorContractVersion:p.z.nativeEnum(he.PasskeyValidatorContractVersion),domain:p.z.string(),type:p.z.literal("passkeys")}),rt=p.z.discriminatedUnion("type",[tt,Qe]),B=p.z.object({kernelVersion:p.z.enum(ie,{errorMap:(r,e)=>({message:`Unsupported kernel version. Supported versions: ${ie.join(", ")}. Version used: ${e.data}. Please contact support`})}),entryPointVersion:p.z.enum(le,{errorMap:(r,e)=>({message:`Unsupported entry point version. Supported versions: ${le.join(", ")}. Version used: ${e.data}. Please contact support`})}),userId:p.z.string().min(1),signers:p.z.array(p.z.object({signerData:rt})).min(0).max(1,"Invalid wallet signer configuration. Please contact support"),smartContractWalletAddress:K.optional()});var Pe=require("viem");function Y(r,e){let t=e(r);return t.replace?t.value:Array.isArray(r)?r.map(n=>Y(n,e)):r!==null&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([n,a])=>[n,Y(a,e)])):t.value}function Ce(r){return Y(r,e=>typeof e=="bigint"?{value:(0,Pe.toHex)(e),replace:!0}:{value:e,replace:!1})}function Ee(r){return Y(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 G=class extends v.BaseCrossmintService{constructor(){super(...arguments);this.logger=S;this.apiErrorService=new v.APIErrorService({ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new A(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new w,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new W})}async idempotentCreateSmartWallet(t,n){await this.fetchCrossmintAPI(`${V}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(n)},"Error creating abstract wallet. Please contact support",t.jwt)}async sponsorUserOperation(t,n,a,o){let s=(0,Ae.blockchainToChainId)(o),i=await this.fetchCrossmintAPI(`${V}/sdk/paymaster`,{method:"POST",body:JSON.stringify({userOp:Ce(n),entryPoint:a,chainId:s})},"Error sponsoring user operation. Please contact support",t.jwt);return Ee(i)}async getSmartWalletConfig(t,n){let a=await this.fetchCrossmintAPI(`${V}/sdk/smart-wallet/config?chain=${n}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",t.jwt),o=B.safeParse(a);if(!o.success)throw new v.CrossmintServiceError(`Invalid smart wallet config, please contact support. Details below:
2
- ${o.error.toString()}`);return o.data}async fetchNFTs(t,n){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${n}:${t}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${t}`)}getPasskeyServerUrl(){return this.crossmintBaseUrl+"api/internal/passkeys"}};var F=require("viem");var j=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=B.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,F.keccak256)((0,F.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}}},I=class{constructor(e){this.type="eoa";this.data=e}display(){return this.data}};var H=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:o,userId:s}){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(f=>f.signerData),m=this.getSigner(i);if(o!=null&&m==null||m!=null&&o==null)throw new l("Either both signer and address must be present, or both must be null");return m==null||o==null?{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:s}}:{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:s},existing:{signerConfig:m,address:o}}}getSigner(e){if(e.length===0)return;let t=e[0];if(t.type==="eoa")return new I(t);if(t.type==="passkeys")return new k(t)}};function pe(r){return"signer"in r&&"type"in r.signer&&r.signer.type==="PASSKEY"}function Te(r){let e=r.existing==null||r.existing.signerConfig.type==="passkeys";return pe(r.walletParams)&&e}function nt(r){return"signer"in r&&("type"in r.signer&&r.signer.type==="VIEM_ACCOUNT"||"request"in r.signer&&typeof r.signer.request=="function")}function be(r){let e=r.existing==null||r.existing.signerConfig.type==="eoa";return nt(r.walletParams)&&e}var z=class{constructor(e,t){this.eoaStrategy=e;this.passkeyStrategy=t}get(e){if(Te(e))return this.passkeyStrategy.create(e);if(be(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=pe(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 ve=require("@zerodev/ecdsa-validator"),ke=require("@zerodev/sdk");function xe(r,e){return r?.toLowerCase()===e?.toLowerCase()}var we=require("permissionless");async function We({walletParams:r}){if(at(r.signer))return await(0,we.providerToSmartAccountSigner)(r.signer);if(st(r.signer))return r.signer.account;{let e=r.signer;throw new l(`The signer type ${e.type} is not supported`)}}function at(r){return r&&typeof r.request=="function"}function st(r){return r&&r.type==="VIEM_ACCOUNT"}var q=class{async create({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:o,user:s,existing:i}){let m=await We({chain:e,walletParams:a});if(i!=null&&!xe(m.address,i.signerConfig.data.eoaAddress))throw new h(`User '${s.id}' has an existing wallet with an eoa signer '${i.signerConfig.data.eoaAddress}', this does not match input eoa signer '${m.address}'.`,i.signerConfig.display(),{type:"eoa",eoaAddress:i.signerConfig.data.eoaAddress});let f=await(0,ve.signerToEcdsaValidator)(t,{signer:m,entryPoint:n,kernelVersion:o});return{account:await(0,ke.createKernelAccount)(t,{plugins:{sudo:f},index:0n,entryPoint:n,kernelVersion:o,deployedAccountAddress:i?.address}),signerConfig:new I({eoaAddress:m.address,type:"eoa"})}}};var R=require("@zerodev/passkey-validator"),Ie=require("@zerodev/sdk"),Re=require("@zerodev/webauthn-key");var J=class{constructor(e,t){this.passkeyServerUrl=e;this.apiKey=t}async create({user:e,publicClient:t,walletParams:n,entryPoint:a,kernelVersion:o,existing:s}){let i=n.signer.passkeyName??e.id;if(s!=null&&s.signerConfig.data.passkeyName!==i)throw new E(`User '${e.id}' has an existing wallet created with a passkey named '${s.signerConfig.data.passkeyName}', this does match input passkey name '${i}'.`,s.signerConfig.display());try{let m=await this.getPasskey(e,i,s?.signerConfig.data),f=R.PasskeyValidatorContractVersion.V0_0_2,g=s==null?f:s.signerConfig.data.validatorContractVersion,O=await(0,R.toPasskeyValidator)(t,{webAuthnKey:m,entryPoint:a,validatorContractVersion:g,kernelVersion:o}),se=await(0,Ie.createKernelAccount)(t,{plugins:{sudo:O},entryPoint:a,kernelVersion:o,deployedAccountAddress:s?.address});return{signerConfig:this.getSignerConfig(O,g,i),account:this.decorate(se,i)}}catch(m){throw this.mapError(m,i)}}async getPasskey(e,t,n){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:(0,Re.toWebAuthnKey)({passkeyName:t,passkeyServerUrl:this.passkeyServerUrl,mode:R.WebAuthnMode.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})}getSignerConfig(e,t,n){return new k({...lt(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 x(t):e.message==="Registration not verified"?new b(t):e.code==="ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY"&&e.name==="NotAllowedError"?new T(t):e}decorate(e,t){return new Proxy(e,{get:(n,a,o)=>{let s=Reflect.get(n,a,o);return typeof s!="function"||typeof a!="string"||!it(a)?s:async(...i)=>{try{return await s.call(n,...i)}catch(m){throw this.mapError(m,t)}}}})}},ot=["signMessage","signTypedData","signUserOperation","signTransaction"];function it(r){return ot.includes(r)}var lt=r=>{let e=pt(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function pt(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}var me=require("viem");function X(r){return!1}var ct=["sendTransaction","writeContract","sendUserOperation"],mt=["signMessage","signTypedData"];function ce(r){return ct.includes(r)}function dt(r){return mt.includes(r)}var Z=class{constructor(e,t=S){this.errorProcessor=e;this.logger=t}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,a,o)=>{let s=Reflect.get(n,a,o);return typeof s!="function"||typeof a!="string"||!(dt(a)||ce(a))?s:(...i)=>this.logger.logPerformance(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,s,i,e))}})}async execute(e,t,n,a,o){try{this.logger.log(`[CrossmintSmartWallet.${t}] - params: ${(0,me.stringify)(a)}`);let s=ce(t)?this.processTxnArgs(t,o,a):a;return await n.call(e,...s)}catch(s){let i=ce(t)?"signing":"sending transaction";throw this.errorProcessor.map(s,new l(`Error ${i}: ${s.message}`,(0,me.stringify)(s)))}}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:o,middleware:s,account:i}]=n;return[{middleware:s,account:i,userOperation:this.addGelatoBundlerProperties(t,o)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(t,a),...n.slice(1)]}addGelatoBundlerProperties(e,t){return X(e)?{...t,maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}:t}};var Le=require("@zerodev/sdk"),ee=require("permissionless"),N=require("viem"),Ke=require("@crossmint/common-sdk-base");var d=require("viem/chains"),y=require("@crossmint/common-sdk-base");var Oe={BASE_SEPOLIA:y.BlockchainIncludingTestnet.BASE_SEPOLIA,POLYGON_AMOY:y.BlockchainIncludingTestnet.POLYGON_AMOY,OPTIMISM_SEPOLIA:y.BlockchainIncludingTestnet.OPTIMISM_SEPOLIA,ARBITRUM_SEPOLIA:y.BlockchainIncludingTestnet.ARBITRUM_SEPOLIA},Sr=(0,y.objectValues)(Oe),_e={BASE:y.BlockchainIncludingTestnet.BASE,POLYGON:y.BlockchainIncludingTestnet.POLYGON,OPTIMISM:y.BlockchainIncludingTestnet.OPTIMISM,ARBITRUM:y.BlockchainIncludingTestnet.ARBITRUM},hr=(0,y.objectValues)(_e),ut={...Oe,..._e},Pr=(0,y.objectValues)(ut),yt={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"},De={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};function Ne(r){return ue+yt[r]}var gt="-7M6vRDBDknwvMxnqah_jbcieWg0qad9",ft={polygon:"polygon-mainnet","polygon-amoy":"polygon-amoy",base:"base-mainnet","base-sepolia":"base-sepolia",optimism:"opt-mainnet","optimism-sepolia":"opt-sepolia",arbitrum:"arb-mainnet","arbitrum-sepolia":"arb-sepolia"};function Ue(r){return`https://${ft[r]}.g.alchemy.com/v2/${gt}`}function Me(r){return!X(r)}function Ve({entryPoint:r,chain:e,walletService:t,user:n}){return{middleware:{sponsorUserOperation:async({userOperation:a})=>{let{sponsorUserOpParams:o}=await t.sponsorUserOperation(n,a,r,e);return o}}}}var Q=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:o,existing:s,userWithId:i},cached:m}=await this.accountConfigService.get(e,t),f=(0,N.createPublicClient)({transport:(0,N.http)(Ue(t))}),{account:g,signerConfig:O}=await this.accountCreator.get({chain:t,walletParams:n,publicClient:f,user:i,entryPoint:a==="v0.6"?ee.ENTRYPOINT_ADDRESS_V06:ee.ENTRYPOINT_ADDRESS_V07,kernelVersion:o,existing:s});s==null&&await this.crossmintService.idempotentCreateSmartWallet(e,{type:de,smartContractWalletAddress:g.address,signerData:O.data,version:0,baseLayer:"evm",chainId:(0,Ke.blockchainToChainId)(t),entryPointVersion:a,kernelVersion:o}),m||this.accountConfigService.cache({entryPointVersion:a,kernelVersion:o,user:i,existing:{address:g.address,signerConfig:O}});let se=(0,Le.createKernelAccountClient)({account:g,chain:De[t],entryPoint:g.entryPoint,bundlerTransport:(0,N.http)(Ne(t)),...Me(t)&&Ve({entryPoint:g.entryPoint,chain:t,walletService:this.crossmintService,user:e})}),Ge=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:se});return new C(this.crossmintService,Ge,f,t)}};var re=require("viem");var te=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof l||e instanceof re.BaseError?e:t}record(e){let t=e instanceof Error?e.message:String(e);this.logger.error(`Smart Wallet SDK Error: ${t}`,{stack:e instanceof Error?e.stack:void 0,name:e instanceof Error?e.name:"UnknownError",details:(0,re.stringify)(e),domain:window.location.hostname,sdk_version:M})}};function $e(){return typeof window<"u"}var ne=class r{constructor(e,t,n=S){this.smartWalletService=e;this.errorProcessor=t;this.logger=n}static init({clientApiKey:e}){if(!$e())throw new l("Smart Wallet SDK should only be used client side.");if(!(0,Ye.validateAPIKey)(e).isValid)throw new Error("API key invalid");let n=new G(e),a=new te(ye),o=new z(new q,new J(n.getPasskeyServerUrl(),e)),s=new j(`smart-wallet-${M}`),i=new Q(n,new H(n,s),o,new Z(a));return new r(i,a)}async getOrCreateWallet(e,t,n={signer:{type:"PASSKEY"}}){return this.logger.logPerformance("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,Be.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 pe=Object.defineProperty;var ze=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Xe=Object.prototype.hasOwnProperty;var Ze=(r,e)=>{for(var t in e)pe(r,t,{get:e[t],enumerable:!0})},Qe=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of qe(e))!Xe.call(r,a)&&a!==t&&pe(r,a,{get:()=>e[a],enumerable:!(n=ze(e,a))||n.enumerable});return r};var et=r=>Qe(pe({},"__esModule",{value:!0}),r);var At={};Ze(At,{AdminAlreadyUsedError:()=>W,AdminMismatchError:()=>h,Chain:()=>ce.EVMBlockchainIncludingTestnet,ConfigError:()=>C,CrossmintSDKError:()=>m.CrossmintSDKError,CrossmintServiceError:()=>m.CrossmintServiceError,EVMSmartWallet:()=>A,JWTDecryptionError:()=>m.JWTDecryptionError,JWTExpiredError:()=>m.JWTExpiredError,JWTIdentifierError:()=>m.JWTIdentifierError,JWTInvalidError:()=>m.JWTInvalidError,NotAuthorizedError:()=>m.NotAuthorizedError,PasskeyIncompatibleAuthenticatorError:()=>v,PasskeyMismatchError:()=>T,PasskeyPromptError:()=>w,PasskeyRegistrationError:()=>x,SmartWalletError:()=>l,SmartWalletErrorCode:()=>m.SmartWalletErrorCode,SmartWalletSDK:()=>le,SmartWalletsNotEnabledError:()=>k,TransferError:()=>m.TransferError,UserWalletAlreadyCreatedError:()=>b,blockchainToChainId:()=>ce.blockchainToChainId});module.exports=et(At);var ce=require("@crossmint/common-sdk-base");var V=require("viem"),Pe=require("@crossmint/client-sdk-base");var U=require("@crossmint/client-sdk-base");var fe="ZeroDev";var K="SCW_SDK",$="0.1.0",B="2024-06-09",me=["0.3.1","0.3.0","0.2.4"],de=["v0.6","v0.7"];var S=new U.SDKLogger(K),Se=new U.SDKLogger(K,(0,U.getBrowserLogger)(K,{onlyDatadog:!0}));var F=require("viem");var he=[{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 Ce({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:F.erc20Abi,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:he,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:F.erc721Abi,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var g=require("viem"),M=require("@crossmint/client-sdk-base"),E=class extends M.CrossmintSDKError{constructor(t,n,a,o=M.WalletErrorCode.SEND_TRANSACTION_FAILED){super(t,o);this.viemError=n;this.stage=a}},Y=class extends E{constructor(t,n,a,o,i,s=a.data,p=a.reason){super(t,n,i,M.WalletErrorCode.SEND_TRANSACTION_EXECUTION_REVERTED);this.viemError=n;this.txId=o;this.stage=i;this.data=s;this.reason=p}},H=class{constructor(e,t={confirmations:2,transactionConfirmationTimeout:3e4}){this.publicClient=e;this.defaultSendTransactionOptions=t}async sendTransaction(e,t,n={}){let{confirmations:a,transactionConfirmationTimeout:o}=this.getConfig(n);await this.simulateCall(e,void 0,"simulation");let i;try{i=await t.writeContract({...e,account:t.account,chain:t.chain})}catch(s){throw s instanceof g.BaseError?new E(s.message,s,"send"):s}try{let s=await this.publicClient.waitForTransactionReceipt({hash:i,confirmations:a,timeout:o});return await this.handleReceipt(s,e)}catch(s){throw s instanceof g.BaseError?new E(s.message,s,"confirmation"):s}}getConfig(e){return{...this.defaultSendTransactionOptions,...e}}async handleReceipt(e,t){if(e.status==="reverted")throw await this.simulateCall(t,e.transactionHash,"execution"),new Y("Transaction reverted but unable to detect the reason",new g.ContractFunctionRevertedError({abi:t.abi,functionName:t.functionName}),new g.ContractFunctionRevertedError({abi:t.abi,functionName:t.functionName}),e.transactionHash,"execution");return e.transactionHash}async simulateCall(e,t,n){try{await this.publicClient.simulateContract({...e,account:e.address,chain:this.publicClient.chain})}catch(a){if(a instanceof g.BaseError){let o=a.walk(i=>i instanceof g.ContractFunctionRevertedError);throw o instanceof g.ContractFunctionRevertedError?new Y(o.message,a,o,t,n):new E(a.message,a,n)}throw a}}};var A=class{constructor(e,t,n,a,o=S){this.crossmintService=e;this.accountClient=t;this.logger=o;this.chain=a,this.client={wallet:t,public:n},this.sendTransactionService=new H(n)}get address(){return this.accountClient.account.address}async transferToken(e,t){return this.logger.logPerformance("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,V.isAddress)(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!(0,V.isAddress)(t.token.contractAddress))throw new Error(`Invalid contract address: '${t.token.contractAddress}' is not a valid EVM address.`);let n=Ce({contract:t.token.contractAddress,to:e,from:this.accountClient.account,config:t});try{let a=this.accountClient.extend(V.publicActions),{request:o}=await a.simulateContract(n),i=await a.writeContract(o);return this.logger.log(`[TRANSFER] - Transaction hash from transfer: ${i}`),i}catch(a){this.logger.error("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{error:a instanceof Error?a.message:JSON.stringify(a),tokenId:n.tokenId,contractAddress:t.token.contractAddress,chain:t.token.chain});let o=n.tokenId==null?"":`:${n.tokenId}}`;throw new Pe.TransferError(`Error transferring token ${t.token.contractAddress}${o}`)}},{toAddress:e,config:t})}async nfts(){return this.crossmintService.fetchNFTs(this.address,this.chain)}async executeContract({address:e,abi:t,functionName:n,args:a,value:o,config:i}){return this.sendTransactionService.sendTransaction({address:e,abi:t,functionName:n,args:a,value:o},this.accountClient,i)}};var u=require("@crossmint/client-sdk-base"),l=class extends u.CrossmintSDKError{constructor(e,t,n=u.SmartWalletErrorCode.UNCATEGORIZED){super(e,n,t)}},h=class extends l{constructor(e,t,n){super(e,u.SmartWalletErrorCode.ADMIN_MISMATCH),this.required=t,this.used=n}},T=class extends l{constructor(e,t,n){super(e,u.SmartWalletErrorCode.PASSKEY_MISMATCH),this.required=t,this.used=n}},b=class extends l{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=u.SmartWalletErrorCode.USER_WALLET_ALREADY_CREATED}},w=class extends l{constructor(e){super(`Prompt was either cancelled or timed out for passkey ${e}`,void 0,u.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,u.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,u.SmartWalletErrorCode.PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=e}},C=class extends l{constructor(e){super(e,void 0,u.SmartWalletErrorCode.WALLET_CONFIG)}},W=class extends C{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=u.SmartWalletErrorCode.ADMIN_SIGNER_ALREADY_USED}},k=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=u.SmartWalletErrorCode.SMART_WALLETS_NOT_ENABLED}};var m=require("@crossmint/client-sdk-base");var Ge=require("viem"),je=require("@crossmint/common-sdk-base");var O=require("@crossmint/client-sdk-base"),we=require("@crossmint/common-sdk-base");var Ee=require("@zerodev/passkey-validator"),j=require("viem"),c=require("zod");var rt=c.z.custom(r=>(0,j.isHex)(r),{message:"Invalid hex string"}),G=c.z.custom(r=>(0,j.isAddress)(r),{message:"Invalid evm address"}),nt=c.z.object({eoaAddress:G,type:c.z.literal("eoa")}),at=c.z.object({entryPoint:G,validatorAddress:G,pubKeyX:c.z.string(),pubKeyY:c.z.string(),authenticatorIdHash:rt,authenticatorId:c.z.string()}),it=at.extend({passkeyName:c.z.string(),validatorContractVersion:c.z.nativeEnum(Ee.PasskeyValidatorContractVersion),domain:c.z.string(),type:c.z.literal("passkeys")}),ot=c.z.discriminatedUnion("type",[it,nt]),J=c.z.object({kernelVersion:c.z.enum(me,{errorMap:(r,e)=>({message:`Unsupported kernel version. Supported versions: ${me.join(", ")}. Version used: ${e.data}. Please contact support`})}),entryPointVersion:c.z.enum(de,{errorMap:(r,e)=>({message:`Unsupported entry point version. Supported versions: ${de.join(", ")}. Version used: ${e.data}. Please contact support`})}),userId:c.z.string().min(1),signers:c.z.array(c.z.object({signerData:ot})).min(0).max(1,"Invalid wallet signer configuration. Please contact support"),smartContractWalletAddress:G.optional()});var Ae=require("viem");function z(r,e){let t=e(r);return t.replace?t.value:Array.isArray(r)?r.map(n=>z(n,e)):r!==null&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([n,a])=>[n,z(a,e)])):t.value}function Te(r){return z(r,e=>typeof e=="bigint"?{value:(0,Ae.toHex)(e),replace:!0}:{value:e,replace:!1})}function be(r){return z(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 q=class extends O.BaseCrossmintService{constructor(){super(...arguments);this.logger=S;this.apiErrorService=new O.APIErrorService({ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new b(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new W,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new k})}async idempotentCreateSmartWallet(t,n){await this.fetchCrossmintAPI(`${B}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(n)},"Error creating abstract wallet. Please contact support",t.jwt)}async sponsorUserOperation(t,n,a,o){let i=(0,we.blockchainToChainId)(o),s=await this.fetchCrossmintAPI(`${B}/sdk/paymaster`,{method:"POST",body:JSON.stringify({userOp:Te(n),entryPoint:a,chainId:i})},"Error sponsoring user operation. Please contact support",t.jwt);return be(s)}async getSmartWalletConfig(t,n){let a=await this.fetchCrossmintAPI(`${B}/sdk/smart-wallet/config?chain=${n}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",t.jwt),o=J.safeParse(a);if(!o.success)throw new O.CrossmintServiceError(`Invalid smart wallet config, please contact support. Details below:
2
+ ${o.error.toString()}`);return o.data}async fetchNFTs(t,n){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${n}:${t}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${t}`)}getPasskeyServerUrl(){return this.crossmintBaseUrl+"api/internal/passkeys"}};var Z=require("viem");var X=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=J.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,Z.keccak256)((0,Z.toHex)(e.jwt))}`}};var I=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}}},R=class{constructor(e){this.type="eoa";this.data=e}display(){return this.data}};var Q=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:o,userId:i}){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 s=a.map(f=>f.signerData),p=this.getSigner(s);if(o!=null&&p==null||p!=null&&o==null)throw new l("Either both signer and address must be present, or both must be null");return p==null||o==null?{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:i}}:{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:i},existing:{signerConfig:p,address:o}}}getSigner(e){if(e.length===0)return;let t=e[0];if(t.type==="eoa")return new R(t);if(t.type==="passkeys")return new I(t)}};function ue(r){return"signer"in r&&"type"in r.signer&&r.signer.type==="PASSKEY"}function xe(r){let e=r.existing==null||r.existing.signerConfig.type==="passkeys";return ue(r.walletParams)&&e}function st(r){return"signer"in r&&("type"in r.signer&&r.signer.type==="VIEM_ACCOUNT"||"request"in r.signer&&typeof r.signer.request=="function")}function ve(r){let e=r.existing==null||r.existing.signerConfig.type==="eoa";return st(r.walletParams)&&e}var ee=class{constructor(e,t){this.eoaStrategy=e;this.passkeyStrategy=t}get(e){if(xe(e))return this.passkeyStrategy.create(e);if(ve(e))return this.eoaStrategy.create(e);if(e.existing==null)throw new C(`Unsupported wallet params:
3
+ ${e.walletParams}`);let t=e.existing.signerConfig.display(),n=ue(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 Ie=require("@zerodev/ecdsa-validator"),Re=require("@zerodev/sdk");function We(r,e){return r?.toLowerCase()===e?.toLowerCase()}var ke=require("permissionless");async function Oe({walletParams:r}){if(lt(r.signer))return await(0,ke.providerToSmartAccountSigner)(r.signer);if(ct(r.signer))return r.signer.account;{let e=r.signer;throw new l(`The signer type ${e.type} is not supported`)}}function lt(r){return r&&typeof r.request=="function"}function ct(r){return r&&r.type==="VIEM_ACCOUNT"}var te=class{async create({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:o,user:i,existing:s}){let p=await Oe({chain:e,walletParams:a});if(s!=null&&!We(p.address,s.signerConfig.data.eoaAddress))throw new h(`User '${i.id}' has an existing wallet with an eoa signer '${s.signerConfig.data.eoaAddress}', this does not match input eoa signer '${p.address}'.`,s.signerConfig.display(),{type:"eoa",eoaAddress:s.signerConfig.data.eoaAddress});let f=await(0,Ie.signerToEcdsaValidator)(t,{signer:p,entryPoint:n,kernelVersion:o});return{account:await(0,Re.createKernelAccount)(t,{plugins:{sudo:f},index:0n,entryPoint:n,kernelVersion:o,deployedAccountAddress:s?.address}),signerConfig:new R({eoaAddress:p.address,type:"eoa"})}}};var _=require("@zerodev/passkey-validator"),_e=require("@zerodev/sdk"),Ne=require("@zerodev/webauthn-key");var re=class{constructor(e,t){this.passkeyServerUrl=e;this.apiKey=t}async create({user:e,publicClient:t,walletParams:n,entryPoint:a,kernelVersion:o,existing:i}){let s=n.signer.passkeyName??e.id;if(i!=null&&i.signerConfig.data.passkeyName!==s)throw new T(`User '${e.id}' has an existing wallet created with a passkey named '${i.signerConfig.data.passkeyName}', this does match input passkey name '${s}'.`,i.signerConfig.display());try{let p=await this.getPasskey(e,s,i?.signerConfig.data),f=_.PasskeyValidatorContractVersion.V0_0_2,P=i==null?f:i.signerConfig.data.validatorContractVersion,D=await(0,_.toPasskeyValidator)(t,{webAuthnKey:p,entryPoint:a,validatorContractVersion:P,kernelVersion:o}),Je=await(0,_e.createKernelAccount)(t,{plugins:{sudo:D},entryPoint:a,kernelVersion:o,deployedAccountAddress:i?.address});return{signerConfig:this.getSignerConfig(D,P,s),account:this.decorate(Je,s)}}catch(p){throw this.mapError(p,s)}}async getPasskey(e,t,n){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:(0,Ne.toWebAuthnKey)({passkeyName:t,passkeyServerUrl:this.passkeyServerUrl,mode:_.WebAuthnMode.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})}getSignerConfig(e,t,n){return new I({...dt(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 w(t):e}decorate(e,t){return new Proxy(e,{get:(n,a,o)=>{let i=Reflect.get(n,a,o);return typeof i!="function"||typeof a!="string"||!mt(a)?i:async(...s)=>{try{return await i.call(n,...s)}catch(p){throw this.mapError(p,t)}}}})}},pt=["signMessage","signTypedData","signUserOperation","signTransaction"];function mt(r){return pt.includes(r)}var dt=r=>{let e=ut(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function ut(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}var ge=require("viem");function ne(r){return!1}var yt=["sendTransaction","writeContract","sendUserOperation"],gt=["signMessage","signTypedData"];function ye(r){return yt.includes(r)}function ft(r){return gt.includes(r)}var ae=class{constructor(e,t=S){this.errorProcessor=e;this.logger=t}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,a,o)=>{let i=Reflect.get(n,a,o);return typeof i!="function"||typeof a!="string"||!(ft(a)||ye(a))?i:(...s)=>this.logger.logPerformance(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,i,s,e))}})}async execute(e,t,n,a,o){try{this.logger.log(`[CrossmintSmartWallet.${t}] - params: ${(0,ge.stringify)(a)}`);let i=ye(t)?this.processTxnArgs(t,o,a):a;return await n.call(e,...i)}catch(i){let s=ye(t)?"signing":"sending transaction";throw this.errorProcessor.map(i,new l(`Error ${s}: ${i.message}`,(0,ge.stringify)(i)))}}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:o,middleware:i,account:s}]=n;return[{middleware:i,account:s,userOperation:this.addGelatoBundlerProperties(t,o)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(t,a),...n.slice(1)]}addGelatoBundlerProperties(e,t){return ne(e)?{...t,maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}:t}};var N=require("permissionless"),Fe=require("permissionless/clients/pimlico"),L=require("viem"),Ye=require("@crossmint/common-sdk-base");var d=require("viem/chains"),y=require("@crossmint/common-sdk-base"),De={BASE_SEPOLIA:y.BlockchainIncludingTestnet.BASE_SEPOLIA,POLYGON_AMOY:y.BlockchainIncludingTestnet.POLYGON_AMOY,OPTIMISM_SEPOLIA:y.BlockchainIncludingTestnet.OPTIMISM_SEPOLIA,ARBITRUM_SEPOLIA:y.BlockchainIncludingTestnet.ARBITRUM_SEPOLIA},Wr=(0,y.objectValues)(De),Ue={BASE:y.BlockchainIncludingTestnet.BASE,POLYGON:y.BlockchainIncludingTestnet.POLYGON,OPTIMISM:y.BlockchainIncludingTestnet.OPTIMISM,ARBITRUM:y.BlockchainIncludingTestnet.ARBITRUM},kr=(0,y.objectValues)(Ue),St={...De,...Ue},Or=(0,y.objectValues)(St),Me={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};var Ve=require("@crossmint/common-sdk-base"),ht="-7M6vRDBDknwvMxnqah_jbcieWg0qad9",Ct="pim_9dKmQPxiTCvtbUNF7XFBbA",Pt={polygon:"polygon-mainnet","polygon-amoy":"polygon-amoy",base:"base-mainnet","base-sepolia":"base-sepolia",optimism:"opt-mainnet","optimism-sepolia":"opt-sepolia",arbitrum:"arb-mainnet","arbitrum-sepolia":"arb-sepolia"};function Le(r){return`https://${Pt[r]}.g.alchemy.com/v2/${ht}`}function Ke(r){return`https://api.pimlico.io/v2/${(0,Ve.blockchainToChainId)(r)}/rpc?apikey=${Ct}`}function $e(r){return!ne(r)}function Be({bundlerClient:r,entryPoint:e,chain:t,walletService:n,user:a}){return{middleware:{gasPrice:async()=>(await r.getUserOperationGasPrice()).fast,sponsorUserOperation:async({userOperation:o})=>{let{sponsorUserOpParams:i}=await n.sponsorUserOperation(a,o,e,t);return i}}}}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:o,existing:i,userWithId:s},cached:p}=await this.accountConfigService.get(e,t),f=(0,L.createPublicClient)({transport:(0,L.http)(Le(t))}),{account:P,signerConfig:D}=await this.accountCreator.get({chain:t,walletParams:n,publicClient:f,user:s,entryPoint:a==="v0.6"?N.ENTRYPOINT_ADDRESS_V06:N.ENTRYPOINT_ADDRESS_V07,kernelVersion:o,existing:i});return i==null&&await this.crossmintService.idempotentCreateSmartWallet(e,{type:fe,smartContractWalletAddress:P.address,signerData:D.data,version:0,baseLayer:"evm",chainId:(0,Ye.blockchainToChainId)(t),entryPointVersion:a,kernelVersion:o}),p||this.accountConfigService.cache({entryPointVersion:a,kernelVersion:o,user:s,existing:{address:P.address,signerConfig:D}}),new A(this.crossmintService,this.smartAccountClient(t,P,e),f,t)}smartAccountClient(e,t,n){let a=(0,L.http)(Ke(e)),o={chain:Me[e],entryPoint:t.entryPoint},i=(0,Fe.createPimlicoBundlerClient)({...o,transport:a}),s=(0,N.createSmartAccountClient)({account:t,bundlerTransport:a,...o,...$e(e)&&Be({bundlerClient:i,entryPoint:t.entryPoint,chain:e,walletService:this.crossmintService,user:n})});return this.clientDecorator.decorate({crossmintChain:e,smartAccountClient:s})}};var se=require("viem");var oe=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof l||e instanceof se.BaseError?e:t}record(e){let t=e instanceof Error?e.message:String(e);this.logger.error(`Smart Wallet SDK Error: ${t}`,{stack:e instanceof Error?e.stack:void 0,name:e instanceof Error?e.name:"UnknownError",details:(0,se.stringify)(e),domain:window.location.hostname,sdk_version:$})}};function He(){return typeof window<"u"}var le=class r{constructor(e,t,n=S){this.smartWalletService=e;this.errorProcessor=t;this.logger=n}static init({clientApiKey:e}){if(!He())throw new l("Smart Wallet SDK should only be used client side.");if(!(0,je.validateAPIKey)(e).isValid)throw new Error("API key invalid");let n=new q(e),a=new oe(Se),o=new ee(new te,new re(n.getPasskeyServerUrl(),e)),i=new X(`smart-wallet-${$}`),s=new ie(n,new Q(n,i),o,new ae(a));return new r(s,a)}async getOrCreateWallet(e,t,n={signer:{type:"PASSKEY"}}){return this.logger.logPerformance("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,Ge.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