@crossmint/client-sdk-smart-wallet 0.1.1 → 0.1.2

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.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ObjectValues } from '@crossmint/common-sdk-base';
2
- export { blockchainToChainId } from '@crossmint/common-sdk-base';
2
+ export { EVMBlockchainIncludingTestnet as Chain, blockchainToChainId } from '@crossmint/common-sdk-base';
3
3
  import { LocalAccount, EIP1193Provider, HttpTransport, Chain, Hex, PublicClient } from 'viem';
4
4
  import { PasskeyValidatorContractVersion } from '@zerodev/passkey-validator';
5
5
  import { SmartAccountClient } from 'permissionless';
@@ -103,6 +103,9 @@ declare const SmartWalletErrors: {
103
103
  readonly ERROR_WALLET_CONFIG: "smart-wallet:wallet-config.error";
104
104
  readonly ERROR_ADMIN_MISMATCH: "smart-wallet:wallet-config.admin-mismatch";
105
105
  readonly ERROR_PASSKEY_MISMATCH: "smart-wallet:wallet-config.passkey-mismatch";
106
+ readonly ERROR_PASSKEY_PROMPT: "smart-wallet:passkey.prompt";
107
+ readonly ERROR_PASSKEY_INCOMPATIBLE_AUTHENTICATOR: "smart-wallet.passkey.incompatible-authenticator";
108
+ readonly ERROR_PASSKEY_REGISTRATION: "smart-wallet:passkey.registration";
106
109
  readonly ERROR_ADMIN_SIGNER_ALREADY_USED: "smart-wallet:wallet-config.admin-signer-already-used";
107
110
  readonly ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED: "smart-wallet:wallet-config.non-custodial-wallets-not-enabled";
108
111
  readonly UNCATEGORIZED: "smart-wallet:uncategorized";
@@ -158,6 +161,18 @@ declare class UserWalletAlreadyCreatedError extends SmartWalletSDKError {
158
161
  readonly code: "smart-wallet:user-wallet-already-created.error";
159
162
  constructor(userId: string);
160
163
  }
164
+ declare class PasskeyPromptError extends SmartWalletSDKError {
165
+ passkeyName: string;
166
+ constructor(passkeyName: string);
167
+ }
168
+ declare class PasskeyRegistrationError extends SmartWalletSDKError {
169
+ passkeyName: string;
170
+ constructor(passkeyName: string);
171
+ }
172
+ declare class PasskeyIncompatibleAuthenticatorError extends SmartWalletSDKError {
173
+ passkeyName: string;
174
+ constructor(passkeyName: string);
175
+ }
161
176
  declare class OutOfCreditsError extends SmartWalletSDKError {
162
177
  constructor(message?: string);
163
178
  }
@@ -296,4 +311,4 @@ declare class SmartWalletSDK extends LoggerWrapper {
296
311
  getOrCreateWallet(user: UserParams, chain: SmartWalletChain, walletParams?: WalletParams): Promise<EVMSmartWallet>;
297
312
  }
298
313
 
299
- export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, CrossmintServiceError, type EOASigner, type ERC20TransferType, EVMSmartWallet, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, type NFTTransferType, NonCustodialWalletsNotEnabledError, NotAuthorizedError, OutOfCreditsError, PasskeyMismatchError, type PasskeySigner, type SFTTransferType, SmartWalletChain, SmartWalletSDK, SmartWalletSDKError, type SmartWalletSDKInitParams, TransferError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
314
+ export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, CrossmintServiceError, type EOASigner, type ERC20TransferType, EVMSmartWallet, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, type NFTTransferType, NonCustodialWalletsNotEnabledError, NotAuthorizedError, OutOfCreditsError, PasskeyIncompatibleAuthenticatorError, PasskeyMismatchError, PasskeyPromptError, PasskeyRegistrationError, type PasskeySigner, type SFTTransferType, SmartWalletSDK, SmartWalletSDKError, type SmartWalletSDKInitParams, TransferError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var Ye=Object.defineProperty,je=Object.defineProperties;var Ge=Object.getOwnPropertyDescriptors;var ge=Object.getOwnPropertySymbols;var He=Object.prototype.hasOwnProperty,ze=Object.prototype.propertyIsEnumerable;var Pe=(r,e,t)=>e in r?Ye(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,c=(r,e)=>{for(var t in e||(e={}))He.call(e,t)&&Pe(r,t,e[t]);if(ge)for(var t of ge(e))ze.call(e,t)&&Pe(r,t,e[t]);return r},S=(r,e)=>je(r,Ge(e));var i=(r,e,t)=>new Promise((n,a)=>{var o=u=>{try{l(t.next(u))}catch(m){a(m)}},s=u=>{try{l(t.throw(u))}catch(m){a(m)}},l=u=>u.done?n(u.value):Promise.resolve(u.value).then(o,s);l((t=t.apply(r,e)).next())});import{blockchainToChainId as ua}from"@crossmint/common-sdk-base";function B(){return typeof window!="undefined"}function F(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function J(r,e){return(r==null?void 0:r.toLowerCase())===(e==null?void 0:e.toLowerCase())}var oe=!1,Y=class{logInfo(e,t){oe&&console.log(e,t)}logError(e,t){oe&&console.error(e,t)}logWarn(e,t){oe&&console.warn(e,t)}};var he="ZeroDev";var Te="pub035be8a594b35be1887b6ba76c4029ca",Re="http://localhost:3000/api",Ae="https://staging.crossmint.com/api",we="https://www.crossmint.com/api",P="SCW_SDK",Ce="0.1.0",se="2024-06-09",Ie="https://rpc.zerodev.app/api/v2/bundler/",_e="https://rpc.zerodev.app/api/v2/paymaster/";import{datadogLogs as le}from"@datadog/browser-logs";var I=class{logInfo(e,t){ie(e,"info",t)}logError(e,t){ie(e,"error",t)}logWarn(e,t){ie(e,"warn",t)}};function ie(r,e,t){let n=t?S(c({},t),{service:P}):{service:P};qe(),le.logger[e](r,n)}function qe(){le.getInternalContext()==null&&le.init({clientToken:Te,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function Xe(){return B()&&F()?new Y:new I}var{logInfo:j,logWarn:Xt,logError:R}=Xe();import{isAddress as ve,publicActions as nt}from"viem";var y={NOT_AUTHORIZED:"smart-wallet:not-authorized",TRANSFER:"smart-wallet:transfer.error",CROSSMINT_SERVICE:"smart-wallet:crossmint-service.error",ERROR_JWT_EXPIRED:"smart-wallet:not-authorized.jwt-expired",ERROR_JWT_INVALID:"smart-wallet:not-authorized.jwt-invalid",ERROR_JWT_DECRYPTION:"smart-wallet:not-authorized.jwt-decryption",ERROR_JWT_IDENTIFIER:"smart-wallet:not-authorized.jwt-identifier",ERROR_USER_WALLET_ALREADY_CREATED:"smart-wallet:user-wallet-already-created.error",ERROR_OUT_OF_CREDITS:"smart-wallet:out-of-credits.error",ERROR_WALLET_CONFIG:"smart-wallet:wallet-config.error",ERROR_ADMIN_MISMATCH:"smart-wallet:wallet-config.admin-mismatch",ERROR_PASSKEY_MISMATCH:"smart-wallet:wallet-config.passkey-mismatch",ERROR_ADMIN_SIGNER_ALREADY_USED:"smart-wallet:wallet-config.admin-signer-already-used",ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:"smart-wallet:wallet-config.non-custodial-wallets-not-enabled",UNCATEGORIZED:"smart-wallet:uncategorized"},p=class extends Error{constructor(e,t,n=y.UNCATEGORIZED){super(e),this.details=t,this.code=n}},O=class extends p{constructor(e){super(e,void 0,y.TRANSFER)}},E=class extends p{constructor(e,t){super(e,void 0,y.CROSSMINT_SERVICE),this.status=t}},h=class extends p{constructor(e,t,n){super(e,y.ERROR_ADMIN_MISMATCH),this.required=t,this.used=n}},D=class extends p{constructor(e,t,n){super(e,y.ERROR_PASSKEY_MISMATCH),this.required=t,this.used=n}},A=class extends p{constructor(e){super(e,void 0,y.NOT_AUTHORIZED)}},b=class extends A{constructor(t){super(`JWT provided expired at timestamp ${t}`);this.code=y.ERROR_JWT_EXPIRED;this.expiredAt=t.toISOString()}},v=class extends A{constructor(){super("Invalid JWT provided");this.code=y.ERROR_JWT_INVALID}},x=class extends A{constructor(){super("Error decrypting JWT");this.code=y.ERROR_JWT_DECRYPTION}},k=class extends A{constructor(t){super(`Missing required identifier '${t}' in the JWT`);this.code=y.ERROR_JWT_IDENTIFIER;this.identifierKey=t}},w=class extends p{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=y.ERROR_USER_WALLET_ALREADY_CREATED}},N=class extends p{constructor(e){super("You've run out of Crossmint API credits. Visit https://docs.crossmint.com/docs/errors for more information",void 0,y.ERROR_OUT_OF_CREDITS)}},V=class extends p{constructor(e){super(e,void 0,y.ERROR_WALLET_CONFIG)}},L=class extends V{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=y.ERROR_ADMIN_SIGNER_ALREADY_USED}},M=class extends V{constructor(){super("Non-custodial wallets are not enabled for this project");this.code=y.ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED}};import{v4 as Ze}from"uuid";var T=class{constructor(e,t={},n=Ze()){this.extraInfo=t;this.logIdempotencyKey=n;return new Proxy(this,{get:(a,o,s)=>{let l=a[o],u=`[${P} - ${e} - ${String(o)}]`;return typeof l=="function"?(...m)=>{this.logInput(m,u);let d=l.apply(a,m);return d instanceof Promise?d.then(f=>(this.logOutput(f,u),f)).catch(f=>{throw this.logError(f,u),f}):(this.logOutput(d,u),d)}:Reflect.get(a,o,s)}})}logInput(e,t){_(`${t} input - ${g(e)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,S(c({args:e},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logOutput(e,t){_(`${t} output - ${g(e)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,S(c({res:e},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logError(e,t){R(`${t} threw_error - ${e} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,c({err:e},this.extraInfo))}logPerformance(e,t){return C(e,t,this.extraInfo)}};function C(r,e,t){return i(this,null,function*(){let n=new Date().getTime(),a=yield e(),o=new Date().getTime()-n,s=c({durationInMs:o},t);return _(`[${P} - ${r} - TIME] - ${g(s)}`,{args:s}),a})}function We(r,e){return function(...t){let n=`[${P} - function: ${e}]`;_(`${n} input: ${g(t)}`,{args:t});try{let a=r.apply(this,t);return a instanceof Promise?a.then(o=>(_(`${n} output: ${g(o)}`,{res:o}),o)).catch(o=>{throw R(`${n} threw_error: ${g(o)}`,{err:o}),o}):(_(`${n} output: ${g(a)}`,{res:a}),a)}catch(a){throw R(`${n} threw_error: ${g(a)}`,{err:a}),a}}}function g(r){try{return r!=null?JSON.stringify(r,null,2):r}catch(e){return Qe(r)}}function Qe(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 _(r,e){if(F()){console.log(r);return}j(r,e)}function Oe(r){var t;let e=r instanceof Error?r:{message:"Unknown error",name:"Unknown error"};if(!(e instanceof Error)&&((t=e.constructor)==null?void 0:t.name)!=="SyntheticBaseEvent")throw R("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)))}import{erc20Abi as tt,erc721Abi as rt}from"viem";var De=[{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 be({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:tt,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:De,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:rt,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var U=class extends T{constructor(t,n,a,o){super("EVMSmartWallet",{chain:o,address:n.account.address});this.crossmintService=t;this.accountClient=n;this.chain=o,this.client={wallet:n,public:a}}get address(){return this.accountClient.account.address}transferToken(t,n){return i(this,null,function*(){return this.logPerformance("TRANSFER",()=>i(this,null,function*(){if(this.chain!==n.token.chain)throw new Error(`Chain mismatch: Expected ${n.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`);if(!ve(t))throw new Error(`Invalid recipient address: '${t}' is not a valid EVM address.`);if(!ve(n.token.contractAddress))throw new Error(`Invalid contract address: '${n.token.contractAddress}' is not a valid EVM address.`);let a=be({contract:n.token.contractAddress,to:t,from:this.accountClient.account,config:n});try{let o=this.accountClient.extend(nt),{request:s}=yield o.simulateContract(a);return yield o.writeContract(s)}catch(o){R("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:P,error:Oe(o),tokenId:a.tokenId,contractAddress:n.token.contractAddress,chain:n.token.chain});let s=a.tokenId==null?"":`:${a.tokenId}}`;throw new O(`Error transferring token ${n.token.contractAddress}${s}`)}}))})}nfts(){return i(this,null,function*(){return this.crossmintService.fetchNFTs(this.address,this.chain)})}};import{base as at,baseSepolia as ot,polygon as st,polygonAmoy as it}from"viem/chains";import{BlockchainIncludingTestnet as G,objectValues as pe}from"@crossmint/common-sdk-base";var xe={BASE_SEPOLIA:G.BASE_SEPOLIA,POLYGON_AMOY:G.POLYGON_AMOY},Ir=pe(xe),ke={BASE:G.BASE,POLYGON:G.POLYGON},_r=pe(ke),Ne=c(c({},xe),ke),Wr=pe(Ne),ce={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"},H={polygon:st,"polygon-amoy":it,base:at,"base-sepolia":ot},me=r=>Ie+ce[r];import{stringify as Vt}from"viem";import{validateAPIKey as Lt}from"@crossmint/common-sdk-base";import{validateAPIKey as lt}from"@crossmint/common-sdk-base";var z=class{constructor(e={ERROR_JWT_INVALID:()=>new v,ERROR_JWT_DECRYPTION:()=>new x,ERROR_JWT_EXPIRED:({expiredAt:t})=>new b(new Date(t)),ERROR_JWT_IDENTIFIER:({identifierKey:t})=>new k(t),ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new w(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new L,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new M}){this.errors=e}throwErrorFromResponse(n){return i(this,arguments,function*({response:e,onServerErrorMessage:t}){if(!e.ok){if(e.status>=500)throw new E(t,e.status);if(e.status===402)throw new N;try{let a=yield e.json(),o=a.code;if(o!=null&&this.errors[o]!=null)throw this.errors[o](a);if(a.message!=null)throw new E(a.message,e.status)}catch(a){if(a instanceof p)throw a;console.error("Error parsing response",a)}throw new E(yield e.text(),e.status)}})}};var $=class $ extends T{constructor(e){super("BaseCrossmintService");let t=lt(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 z}fetchCrossmintAPI(o){return i(this,arguments,function*(e,t={method:"GET"},n,a){return C("FETCH_CROSSMINT_API",()=>i(this,null,function*(){let s=`${this.crossmintBaseUrl}/${e}`,{body:l,method:u}=t,m;try{m=yield fetch(s,{body:l,method:u,headers:c(c({},this.crossmintAPIHeaders),a!=null&&{Authorization:`Bearer ${a}`})})}catch(d){throw new E(`Error fetching Crossmint API: ${d}`)}return m.ok||(yield this.apiErrorService.throwErrorFromResponse({response:m,onServerErrorMessage:n})),yield m.json()}),{endpoint:e})})}getUrlFromEnv(e){let t=$.urlMap[e];if(!t)throw console.log(" CrossmintService.urlMap: ",$.urlMap),new Error(`URL not found for environment: ${e}`);return t}};$.urlMap={development:Re,staging:Ae,production:we};var q=$;var X=class extends q{idempotentCreateSmartWallet(e,t){return i(this,null,function*(){return this.fetchCrossmintAPI(`${se}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(t)},"Error creating abstract wallet. Please contact support",e.jwt)})}getSmartWalletConfig(e,t){return i(this,null,function*(){return this.fetchCrossmintAPI(`${se}/sdk/smart-wallet/config?chain=${t}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",e.jwt)})}fetchNFTs(e,t){return i(this,null,function*(){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${t}:${e}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${e}`)})}getPasskeyServerUrl(){return this.crossmintBaseUrl+"/internal/passkeys"}};function Z(r){return!1}import{stringify as Ve}from"viem";var pt=["sendTransaction","writeContract","sendUserOperation"],ct=["signMessage","signTypedData"];function de(r){return pt.includes(r)}function mt(r){return ct.includes(r)}var Q=class{constructor(e){this.errorProcessor=e}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"||!(mt(a)||de(a))?s:(...l)=>C(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,s,l,e))}})}execute(e,t,n,a,o){return i(this,null,function*(){try{j(`[CrossmintSmartWallet.${t}] - params: ${Ve(a)}`);let s=de(t)?this.processTxnArgs(t,o,a):a;return yield n.call(e,...s)}catch(s){let l=de(t)?"signing":"sending transaction";throw this.errorProcessor.map(s,new p(`Error ${l}: ${s.message}`,Ve(s)))}})}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:o,middleware:s,account:l}]=n;return[{middleware:s,account:l,userOperation:this.addGelatoBundlerProperties(t,o)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(t,a),...n.slice(1)]}addGelatoBundlerProperties(e,t){return Z(e)?S(c({},t),{maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}):t}};function ee(r){return{pubKeyX:r.pubKeyX,pubKeyY:r.pubKeyY,passkeyName:r.passkeyName,type:"passkeys"}}import{createKernelAccountClient as Wt}from"@zerodev/sdk";import{ENTRYPOINT_ADDRESS_V06 as Ot,ENTRYPOINT_ADDRESS_V07 as Dt}from"permissionless";import{createPublicClient as bt,getAddress as vt,http as Fe}from"viem";import{blockchainToChainId as xt}from"@crossmint/common-sdk-base";var ue=["0.3.1","0.3.0","0.2.4"];function Le(r){return ue.includes(r)}var ye=["v0.6","v0.7"];function Me(r){return ye.includes(r)}import{providerToSmartAccountSigner as dt}from"permissionless";var Ue=We(e=>i(void 0,[e],function*({walletParams:r}){if(ut(r.signer))return yield dt(r.signer);if(yt(r.signer))return r.signer.account;{let t=r.signer;throw new p(`The signer type ${t.type} is not supported`)}}),"createOwnerSigner");function ut(r){return r&&typeof r.request=="function"}function yt(r){return r&&r.type==="VIEM_ACCOUNT"}import{signerToEcdsaValidator as ft}from"@zerodev/ecdsa-validator";import{createKernelAccount as St}from"@zerodev/sdk";var te=class{get(u,m){return i(this,arguments,function*({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:o,user:s},l){let d=yield Ue({chain:e,walletParams:a});if(l!=null&&!J(d.address,l.eoaAddress))throw new h(`User '${s.id}' has an existing wallet with an eoa signer '${l.eoaAddress}', this does not match input eoa signer '${d.address}'.`,l,{type:"eoa",eoaAddress:l.eoaAddress});let f=yield ft(t,{signer:d,entryPoint:n.address,kernelVersion:o});return{account:yield St(t,{plugins:{sudo:f},index:BigInt(0),entryPoint:n.address,kernelVersion:o}),signerData:{eoaAddress:d.address,type:"eoa"}}})}};import{PasskeyValidatorContractVersion as Et,WebAuthnMode as gt,toPasskeyValidator as Pt}from"@zerodev/passkey-validator";import{createKernelAccount as ht}from"@zerodev/sdk";import{toWebAuthnKey as Tt}from"@zerodev/webauthn-key";function $e(r){return r.walletParams.signer.type==="PASSKEY"}var re=class{constructor(e){this.crossmintService=e}get(l,u){return i(this,arguments,function*({user:e,publicClient:t,walletParams:n,entryPoint:a,kernelVersion:o},s){var Ee;let m=(Ee=n.signer.passkeyName)!=null?Ee:e.id;if(s!=null&&s.passkeyName!==m)throw new D(`User '${e.id}' has an existing wallet created with a passkey named '${s.passkeyName}', this does match input passkey name '${m}'.`,ee(s));let d=yield this.getPasskey(e,m,s),f=Et.V0_0_2,W=s==null?f:s.validatorContractVersion,K=yield Pt(t,{webAuthnKey:d,entryPoint:a.address,validatorContractVersion:W,kernelVersion:o}),Je=yield ht(t,{plugins:{sudo:K},entryPoint:a.address,kernelVersion:o});return{signerData:this.getSignerData(K,W,m),account:Je}})}getPasskey(e,t,n){return i(this,null,function*(){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:Tt({passkeyName:t,passkeyServerUrl:this.crossmintService.getPasskeyServerUrl(),mode:gt.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})})}getSignerData(e,t,n){return S(c({},Rt(e.getSerializedData())),{passkeyName:n,validatorContractVersion:t,domain:window.location.hostname,type:"passkeys"})}createPasskeysServerHeaders(e){return{"x-api-key":this.crossmintService.crossmintAPIHeaders["x-api-key"],Authorization:`Bearer ${e.jwt}`}}},Rt=r=>{let e=At(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function At(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}import{createZeroDevPaymasterClient as wt}from"@zerodev/sdk";import{http as Ct}from"viem";function Ke(r){return!Z(r)}var It=r=>_e+ce[r];function Be({entryPoint:r,chain:e}){return{middleware:{sponsorUserOperation:n=>i(this,[n],function*({userOperation:t}){return wt({chain:H[e],transport:Ct(It(e)),entryPoint:r}).sponsorUserOperation({userOperation:t,entryPoint:r})})}}}var ne=class{constructor(e,t,n=new fe(new te,new re(e))){this.crossmintWalletService=e;this.clientDecorator=t;this.accountFactory=n}getOrCreate(e,t,n){return i(this,null,function*(){let{entryPoint:a,kernelVersion:o,existingSignerConfig:s,smartContractWalletAddress:l,userId:u}=yield this.fetchConfig(e,t),m=bt({transport:Fe(me(t))}),{account:d,signerData:f}=yield this.accountFactory.get({chain:t,walletParams:n,publicClient:m,user:S(c({},e),{id:u}),entryPoint:a,kernelVersion:o},s);if(l!=null&&!J(l,d.address))throw new w(u);s==null&&(yield this.crossmintWalletService.idempotentCreateSmartWallet(e,{type:he,smartContractWalletAddress:d.address,signerData:f,version:0,baseLayer:"evm",chainId:xt(t),entryPointVersion:a.version,kernelVersion:o}));let W=Wt(c({account:d,chain:H[t],entryPoint:d.entryPoint,bundlerTransport:Fe(me(t))},Ke(t)&&Be({entryPoint:d.entryPoint,chain:t}))),K=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:W});return new U(this.crossmintWalletService,K,m,t)})}fetchConfig(e,t){return i(this,null,function*(){let{entryPointVersion:n,kernelVersion:a,signers:o,smartContractWalletAddress:s,userId:l}=yield this.crossmintWalletService.getSmartWalletConfig(e,t);if(!Le(a))throw new p(`Unsupported kernel version. Supported versions: ${ue.join(", ")}. Version used: ${a}, Please contact support`);if(!Me(n))throw new p(`Unsupported entry point version. Supported versions: ${ye.join(", ")}. Version used: ${n}. Please contact support`);if(n==="v0.7"&&a.startsWith("0.2")||n==="v0.6"&&a.startsWith("0.3"))throw new p(`Unsupported combination: entryPoint ${n} and kernel version ${a}. Please contact support`);return{entryPoint:{version:n,address:n==="v0.6"?Ot:Dt},kernelVersion:a,userId:l,existingSignerConfig:this.getSigner(o),smartContractWalletAddress:s!=null?vt(s):void 0}})}getSigner(e){if(e.length!==0){if(e.length>1)throw new E("Invalid wallet signer configuration. Please contact support");return e[0].signerData}}},fe=class{constructor(e,t){this.eoa=e;this.passkey=t}get(e,t){if($e(e)){if(t!=null&&(t==null?void 0:t.type)!=="passkeys")throw new h(`Cannot create wallet with passkey signer for user '${e.user.id}', they have an existing wallet with eoa signer '${t.eoaAddress}.'`,t);return this.passkey.get(e,t)}if(t!=null&&(t==null?void 0:t.type)!=="eoa")throw new h(`Cannot create wallet with eoa signer for user '${e.user.id}', they already have a wallet with a passkey named '${t.passkeyName}' as it's signer.`,ee(t));return this.eoa.get(e,t)}};import{BaseError as kt,stringify as Nt}from"viem";var ae=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof p||e instanceof kt?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:Nt(e),domain:window.location.hostname,sdk_version:Ce})}};var Se=class r extends T{constructor(t,n){super("SmartWalletSDK");this.smartWalletService=t;this.errorProcessor=n}static init({clientApiKey:t}){if(!B())throw new p("Smart Wallet SDK should only be used client side.");if(!Lt(t).isValid)throw new Error("API key invalid");let a=new X(t),o=new ae(new I);return new r(new ne(a,new Q(o)),o)}getOrCreateWallet(o,s){return i(this,arguments,function*(t,n,a={signer:{type:"PASSKEY"}}){return C("GET_OR_CREATE_WALLET",()=>i(this,null,function*(){try{return yield this.smartWalletService.getOrCreate(t,n,a)}catch(l){throw this.errorProcessor.map(l,new p(`Wallet creation failed: ${l.message}.`,Vt(l)))}}),{user:t,chain:n})})}};export{L as AdminAlreadyUsedError,h as AdminMismatchError,V as ConfigError,E as CrossmintServiceError,U as EVMSmartWallet,x as JWTDecryptionError,b as JWTExpiredError,k as JWTIdentifierError,v as JWTInvalidError,M as NonCustodialWalletsNotEnabledError,A as NotAuthorizedError,N as OutOfCreditsError,D as PasskeyMismatchError,Ne as SmartWalletChain,Se as SmartWalletSDK,p as SmartWalletSDKError,O as TransferError,w as UserWalletAlreadyCreatedError,ua as blockchainToChainId};
1
+ var Ht=Object.defineProperty,jt=Object.defineProperties;var zt=Object.getOwnPropertyDescriptors;var Rt=Object.getOwnPropertySymbols;var qt=Object.prototype.hasOwnProperty,Xt=Object.prototype.propertyIsEnumerable;var Tt=(r,t,e)=>t in r?Ht(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e,d=(r,t)=>{for(var e in t||(t={}))qt.call(t,e)&&Tt(r,e,t[e]);if(Rt)for(var e of Rt(t))Xt.call(t,e)&&Tt(r,e,t[e]);return r},E=(r,t)=>jt(r,zt(t));var i=(r,t,e)=>new Promise((n,a)=>{var o=u=>{try{l(e.next(u))}catch(p){a(p)}},s=u=>{try{l(e.throw(u))}catch(p){a(p)}},l=u=>u.done?n(u.value):Promise.resolve(u.value).then(o,s);l((e=e.apply(r,t)).next())});import{blockchainToChainId as Sa,EVMBlockchainIncludingTestnet as ga}from"@crossmint/common-sdk-base";function J(){return typeof window!="undefined"}function G(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function H(r,t){return(r==null?void 0:r.toLowerCase())===(t==null?void 0:t.toLowerCase())}var lt=!1,j=class{logInfo(t,e){lt&&console.log(t,e)}logError(t,e){lt&&console.error(t,e)}logWarn(t,e){lt&&console.warn(t,e)}};var At="ZeroDev";var wt="pub035be8a594b35be1887b6ba76c4029ca",It="http://localhost:3000/api",Ct="https://staging.crossmint.com/api",_t="https://www.crossmint.com/api",P="SCW_SDK",Ot="0.1.0",ct="2024-06-09",Wt="https://rpc.zerodev.app/api/v2/bundler/",bt="https://rpc.zerodev.app/api/v2/paymaster/";import{datadogLogs as mt}from"@datadog/browser-logs";var C=class{logInfo(t,e){pt(t,"info",e)}logError(t,e){pt(t,"error",e)}logWarn(t,e){pt(t,"warn",e)}};function pt(r,t,e){let n=e?E(d({},e),{service:P}):{service:P};Zt(),mt.logger[t](r,n)}function Zt(){mt.getInternalContext()==null&&mt.init({clientToken:wt,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function Qt(){return J()&&G()?new j:new C}var{logInfo:z,logWarn:rr,logError:T}=Qt();import{isAddress as Nt,publicActions as oe}from"viem";var y={NOT_AUTHORIZED:"smart-wallet:not-authorized",TRANSFER:"smart-wallet:transfer.error",CROSSMINT_SERVICE:"smart-wallet:crossmint-service.error",ERROR_JWT_EXPIRED:"smart-wallet:not-authorized.jwt-expired",ERROR_JWT_INVALID:"smart-wallet:not-authorized.jwt-invalid",ERROR_JWT_DECRYPTION:"smart-wallet:not-authorized.jwt-decryption",ERROR_JWT_IDENTIFIER:"smart-wallet:not-authorized.jwt-identifier",ERROR_USER_WALLET_ALREADY_CREATED:"smart-wallet:user-wallet-already-created.error",ERROR_OUT_OF_CREDITS:"smart-wallet:out-of-credits.error",ERROR_WALLET_CONFIG:"smart-wallet:wallet-config.error",ERROR_ADMIN_MISMATCH:"smart-wallet:wallet-config.admin-mismatch",ERROR_PASSKEY_MISMATCH:"smart-wallet:wallet-config.passkey-mismatch",ERROR_PASSKEY_PROMPT:"smart-wallet:passkey.prompt",ERROR_PASSKEY_INCOMPATIBLE_AUTHENTICATOR:"smart-wallet.passkey.incompatible-authenticator",ERROR_PASSKEY_REGISTRATION:"smart-wallet:passkey.registration",ERROR_ADMIN_SIGNER_ALREADY_USED:"smart-wallet:wallet-config.admin-signer-already-used",ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:"smart-wallet:wallet-config.non-custodial-wallets-not-enabled",UNCATEGORIZED:"smart-wallet:uncategorized"},c=class extends Error{constructor(t,e,n=y.UNCATEGORIZED){super(t),this.details=e,this.code=n}},O=class extends c{constructor(t){super(t,void 0,y.TRANSFER)}},S=class extends c{constructor(t,e){super(t,void 0,y.CROSSMINT_SERVICE),this.status=e}},h=class extends c{constructor(t,e,n){super(t,y.ERROR_ADMIN_MISMATCH),this.required=e,this.used=n}},W=class extends c{constructor(t,e,n){super(t,y.ERROR_PASSKEY_MISMATCH),this.required=e,this.used=n}},A=class extends c{constructor(t){super(t,void 0,y.NOT_AUTHORIZED)}},b=class extends A{constructor(e){super(`JWT provided expired at timestamp ${e}`);this.code=y.ERROR_JWT_EXPIRED;this.expiredAt=e.toISOString()}},D=class extends A{constructor(){super("Invalid JWT provided");this.code=y.ERROR_JWT_INVALID}},v=class extends A{constructor(){super("Error decrypting JWT");this.code=y.ERROR_JWT_DECRYPTION}},x=class extends A{constructor(e){super(`Missing required identifier '${e}' in the JWT`);this.code=y.ERROR_JWT_IDENTIFIER;this.identifierKey=e}},w=class extends c{constructor(e){super(`The user with userId ${e.toString()} already has a wallet created for this project`);this.code=y.ERROR_USER_WALLET_ALREADY_CREATED}},k=class extends c{constructor(t){super(`Prompt was either cancelled or timed out for passkey ${t}`,void 0,y.ERROR_PASSKEY_PROMPT),this.passkeyName=t}},N=class extends c{constructor(t){super(`Registration for passkey ${t} failed, either the registration took too long, or passkey signature vaildation failed.`,void 0,y.ERROR_PASSKEY_REGISTRATION),this.passkeyName=t}},V=class extends c{constructor(t){super(`User selected authenticator for passkey ${t} is not compatible with Crossmint's Smart Wallets.`,void 0,y.ERROR_PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=t}},M=class extends c{constructor(t){super("You've run out of Crossmint API credits. Visit https://docs.crossmint.com/docs/errors for more information",void 0,y.ERROR_OUT_OF_CREDITS)}},L=class extends c{constructor(t){super(t,void 0,y.ERROR_WALLET_CONFIG)}},U=class extends L{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=y.ERROR_ADMIN_SIGNER_ALREADY_USED}},K=class extends L{constructor(){super("Non-custodial wallets are not enabled for this project");this.code=y.ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED}};import{v4 as te}from"uuid";var R=class{constructor(t,e={},n=te()){this.extraInfo=e;this.logIdempotencyKey=n;return new Proxy(this,{get:(a,o,s)=>{let l=a[o],u=`[${P} - ${t} - ${String(o)}]`;return typeof l=="function"?(...p)=>{this.logInput(p,u);let m=l.apply(a,p);return m instanceof Promise?m.then(f=>(this.logOutput(f,u),f)).catch(f=>{throw this.logError(f,u),f}):(this.logOutput(m,u),m)}:Reflect.get(a,o,s)}})}logInput(t,e){_(`${e} input - ${g(t)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,E(d({args:t},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logOutput(t,e){_(`${e} output - ${g(t)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,E(d({res:t},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logError(t,e){T(`${e} threw_error - ${t} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,d({err:t},this.extraInfo))}logPerformance(t,e){return I(t,e,this.extraInfo)}};function I(r,t,e){return i(this,null,function*(){let n=new Date().getTime(),a=yield t(),o=new Date().getTime()-n,s=d({durationInMs:o},e);return _(`[${P} - ${r} - TIME] - ${g(s)}`,{args:s}),a})}function Dt(r,t){return function(...e){let n=`[${P} - function: ${t}]`;_(`${n} input: ${g(e)}`,{args:e});try{let a=r.apply(this,e);return a instanceof Promise?a.then(o=>(_(`${n} output: ${g(o)}`,{res:o}),o)).catch(o=>{throw T(`${n} threw_error: ${g(o)}`,{err:o}),o}):(_(`${n} output: ${g(a)}`,{res:a}),a)}catch(a){throw T(`${n} threw_error: ${g(a)}`,{err:a}),a}}}function g(r){try{return r!=null?JSON.stringify(r,null,2):r}catch(t){return ee(r)}}function ee(r){let t={};for(let e in r)Object.prototype.hasOwnProperty.call(r,e)&&typeof r[e]!="object"&&typeof r[e]!="function"&&(t[e]=r[e]);return JSON.stringify(t,null,2)}function _(r,t){if(G()){console.log(r);return}z(r,t)}function vt(r){var e;let t=r instanceof Error?r:{message:"Unknown error",name:"Unknown error"};if(!(t instanceof Error)&&((e=t.constructor)==null?void 0:e.name)!=="SyntheticBaseEvent")throw T("ERROR_TO_JSON_FAILED",{error:t}),new Error("[errorToJSON] err is not instanceof Error nor SyntheticBaseEvent");return JSON.parse(JSON.stringify(t,Object.getOwnPropertyNames(t)))}import{erc20Abi as ne,erc721Abi as ae}from"viem";var xt=[{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 kt({contract:r,config:t,from:e,to:n}){switch(t.token.type){case"ft":return{account:e,address:r,abi:ne,functionName:"transfer",args:[n,t.amount]};case"sft":return{account:e,address:r,abi:xt,functionName:"safeTransferFrom",args:[e.address,n,t.token.tokenId,t.quantity,"0x00"],tokenId:t.token.tokenId};case"nft":return{account:e,address:r,abi:ae,functionName:"safeTransferFrom",args:[e.address,n,t.token.tokenId],tokenId:t.token.tokenId}}}var $=class extends R{constructor(e,n,a,o){super("EVMSmartWallet",{chain:o,address:n.account.address});this.crossmintService=e;this.accountClient=n;this.chain=o,this.client={wallet:n,public:a}}get address(){return this.accountClient.account.address}transferToken(e,n){return i(this,null,function*(){return this.logPerformance("TRANSFER",()=>i(this,null,function*(){if(this.chain!==n.token.chain)throw new Error(`Chain mismatch: Expected ${n.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`);if(!Nt(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!Nt(n.token.contractAddress))throw new Error(`Invalid contract address: '${n.token.contractAddress}' is not a valid EVM address.`);let a=kt({contract:n.token.contractAddress,to:e,from:this.accountClient.account,config:n});try{let o=this.accountClient.extend(oe),{request:s}=yield o.simulateContract(a);return yield o.writeContract(s)}catch(o){T("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:P,error:vt(o),tokenId:a.tokenId,contractAddress:n.token.contractAddress,chain:n.token.chain});let s=a.tokenId==null?"":`:${a.tokenId}}`;throw new O(`Error transferring token ${n.token.contractAddress}${s}`)}}))})}nfts(){return i(this,null,function*(){return this.crossmintService.fetchNFTs(this.address,this.chain)})}};import{stringify as $e}from"viem";import{validateAPIKey as Be}from"@crossmint/common-sdk-base";import{validateAPIKey as se}from"@crossmint/common-sdk-base";var q=class{constructor(t={ERROR_JWT_INVALID:()=>new D,ERROR_JWT_DECRYPTION:()=>new v,ERROR_JWT_EXPIRED:({expiredAt:e})=>new b(new Date(e)),ERROR_JWT_IDENTIFIER:({identifierKey:e})=>new x(e),ERROR_USER_WALLET_ALREADY_CREATED:({userId:e})=>new w(e),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new U,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new K}){this.errors=t}throwErrorFromResponse(n){return i(this,arguments,function*({response:t,onServerErrorMessage:e}){if(!t.ok){if(t.status>=500)throw new S(e,t.status);if(t.status===402)throw new M;try{let a=yield t.json(),o=a.code;if(o!=null&&this.errors[o]!=null)throw this.errors[o](a);if(a.message!=null)throw new S(a.message,t.status)}catch(a){if(a instanceof c)throw a;console.error("Error parsing response",a)}throw new S(yield t.text(),t.status)}})}};var B=class B extends R{constructor(t){super("BaseCrossmintService");let e=se(t);if(!e.isValid)throw new Error("API key invalid");this.crossmintAPIHeaders={accept:"application/json","content-type":"application/json","x-api-key":t},this.crossmintBaseUrl=this.getUrlFromEnv(e.environment),this.apiErrorService=new q}fetchCrossmintAPI(o){return i(this,arguments,function*(t,e={method:"GET"},n,a){return I("FETCH_CROSSMINT_API",()=>i(this,null,function*(){let s=`${this.crossmintBaseUrl}/${t}`,{body:l,method:u}=e,p;try{p=yield fetch(s,{body:l,method:u,headers:d(d({},this.crossmintAPIHeaders),a!=null&&{Authorization:`Bearer ${a}`})})}catch(m){throw new S(`Error fetching Crossmint API: ${m}`)}return p.ok||(yield this.apiErrorService.throwErrorFromResponse({response:p,onServerErrorMessage:n})),yield p.json()}),{endpoint:t})})}getUrlFromEnv(t){let e=B.urlMap[t];if(!e)throw console.log(" CrossmintService.urlMap: ",B.urlMap),new Error(`URL not found for environment: ${t}`);return e}};B.urlMap={development:It,staging:Ct,production:_t};var X=B;var Z=class extends X{idempotentCreateSmartWallet(t,e){return i(this,null,function*(){return this.fetchCrossmintAPI(`${ct}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(e)},"Error creating abstract wallet. Please contact support",t.jwt)})}getSmartWalletConfig(t,e){return i(this,null,function*(){return this.fetchCrossmintAPI(`${ct}/sdk/smart-wallet/config?chain=${e}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",t.jwt)})}fetchNFTs(t,e){return i(this,null,function*(){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${e}:${t}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${t}`)})}getPasskeyServerUrl(){return this.crossmintBaseUrl+"/internal/passkeys"}};function Q(r){return!1}import{stringify as Vt}from"viem";var ie=["sendTransaction","writeContract","sendUserOperation"],le=["signMessage","signTypedData"];function dt(r){return ie.includes(r)}function ce(r){return le.includes(r)}var tt=class{constructor(t){this.errorProcessor=t}decorate({crossmintChain:t,smartAccountClient:e}){return new Proxy(e,{get:(n,a,o)=>{let s=Reflect.get(n,a,o);return typeof s!="function"||typeof a!="string"||!(ce(a)||dt(a))?s:(...l)=>I(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,s,l,t))}})}execute(t,e,n,a,o){return i(this,null,function*(){try{z(`[CrossmintSmartWallet.${e}] - params: ${Vt(a)}`);let s=dt(e)?this.processTxnArgs(e,o,a):a;return yield n.call(t,...s)}catch(s){let l=dt(e)?"signing":"sending transaction";throw this.errorProcessor.map(s,new c(`Error ${l}: ${s.message}`,Vt(s)))}})}processTxnArgs(t,e,n){if(t==="sendUserOperation"){let[{userOperation:o,middleware:s,account:l}]=n;return[{middleware:s,account:l,userOperation:this.addGelatoBundlerProperties(e,o)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(e,a),...n.slice(1)]}addGelatoBundlerProperties(t,e){return Q(t)?E(d({},e),{maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}):e}};function et(r){return{pubKeyX:r.pubKeyX,pubKeyY:r.pubKeyY,passkeyName:r.passkeyName,type:"passkeys"}}import{createKernelAccountClient as xe}from"@zerodev/sdk";import{ENTRYPOINT_ADDRESS_V06 as ke,ENTRYPOINT_ADDRESS_V07 as Ne}from"permissionless";import{createPublicClient as Ve,getAddress as Me,http as Jt}from"viem";import{blockchainToChainId as Le}from"@crossmint/common-sdk-base";var ut=["0.3.1","0.3.0","0.2.4"];function Mt(r){return ut.includes(r)}var yt=["v0.6","v0.7"];function Lt(r){return yt.includes(r)}import{base as pe,baseSepolia as me,polygon as de,polygonAmoy as ue}from"viem/chains";import{BlockchainIncludingTestnet as rt,objectValues as ft}from"@crossmint/common-sdk-base";var Ut={BASE_SEPOLIA:rt.BASE_SEPOLIA,POLYGON_AMOY:rt.POLYGON_AMOY},en=ft(Ut),Kt={BASE:rt.BASE,POLYGON:rt.POLYGON},rn=ft(Kt),ye=d(d({},Ut),Kt),nn=ft(ye),Et={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"},nt={polygon:de,"polygon-amoy":ue,base:pe,"base-sepolia":me},St=r=>Wt+Et[r];import{providerToSmartAccountSigner as fe}from"permissionless";var $t=Dt(t=>i(void 0,[t],function*({walletParams:r}){if(Ee(r.signer))return yield fe(r.signer);if(Se(r.signer))return r.signer.account;{let e=r.signer;throw new c(`The signer type ${e.type} is not supported`)}}),"createOwnerSigner");function Ee(r){return r&&typeof r.request=="function"}function Se(r){return r&&r.type==="VIEM_ACCOUNT"}import{signerToEcdsaValidator as ge}from"@zerodev/ecdsa-validator";import{createKernelAccount as Pe}from"@zerodev/sdk";var at=class{get(u,p){return i(this,arguments,function*({chain:t,publicClient:e,entryPoint:n,walletParams:a,kernelVersion:o,user:s},l){let m=yield $t({chain:t,walletParams:a});if(l!=null&&!H(m.address,l.eoaAddress))throw new h(`User '${s.id}' has an existing wallet with an eoa signer '${l.eoaAddress}', this does not match input eoa signer '${m.address}'.`,l,{type:"eoa",eoaAddress:l.eoaAddress});let f=yield ge(e,{signer:m,entryPoint:n.address,kernelVersion:o});return{account:yield Pe(e,{plugins:{sudo:f},index:BigInt(0),entryPoint:n.address,kernelVersion:o}),signerData:{eoaAddress:m.address,type:"eoa"}}})}};import{PasskeyValidatorContractVersion as he,WebAuthnMode as Re,toPasskeyValidator as Te}from"@zerodev/passkey-validator";import{createKernelAccount as Ae}from"@zerodev/sdk";import{toWebAuthnKey as we}from"@zerodev/webauthn-key";function Bt(r){return r.walletParams.signer.type==="PASSKEY"}var ot=class{constructor(t){this.crossmintService=t}get(l,u){return i(this,arguments,function*({user:t,publicClient:e,walletParams:n,entryPoint:a,kernelVersion:o},s){var m;let p=(m=n.signer.passkeyName)!=null?m:t.id;if(s!=null&&s.passkeyName!==p)throw new W(`User '${t.id}' has an existing wallet created with a passkey named '${s.passkeyName}', this does match input passkey name '${p}'.`,et(s));try{let f=yield this.getPasskey(t,p,s),Y=he.V0_0_2,F=s==null?Y:s.validatorContractVersion,ht=yield Te(e,{webAuthnKey:f,entryPoint:a.address,validatorContractVersion:F,kernelVersion:o}),Gt=yield Ae(e,{plugins:{sudo:ht},entryPoint:a.address,kernelVersion:o});return{signerData:this.getSignerData(ht,F,p),account:this.decorate(Gt,p)}}catch(f){throw this.mapError(f,p)}})}getPasskey(t,e,n){return i(this,null,function*(){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:we({passkeyName:e,passkeyServerUrl:this.crossmintService.getPasskeyServerUrl(),mode:Re.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(t)})})}getSignerData(t,e,n){return E(d({},_e(t.getSerializedData())),{passkeyName:n,validatorContractVersion:e,domain:window.location.hostname,type:"passkeys"})}createPasskeysServerHeaders(t){return{"x-api-key":this.crossmintService.crossmintAPIHeaders["x-api-key"],Authorization:`Bearer ${t.jwt}`}}mapError(t,e){return t.code===0&&t.name==="DataError"?new V(e):t.message==="Registration not verified"?new N(e):t.code==="ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY"&&t.name==="NotAllowedError"?new k(e):t}decorate(t,e){return new Proxy(t,{get:(n,a,o)=>{let s=Reflect.get(n,a,o);return typeof s!="function"||typeof a!="string"||!Ce(a)?s:(...l)=>i(this,null,function*(){try{return yield s.call(n,...l)}catch(u){throw this.mapError(u,e)}})}})}},Ie=["signMessage","signTypedData","signUserOperation","signTransaction"];function Ce(r){return Ie.includes(r)}var _e=r=>{let t=Oe(r),e=new TextDecoder().decode(t);return JSON.parse(e)};function Oe(r){let t=atob(r);return Uint8Array.from(t,e=>e.codePointAt(0))}import{createZeroDevPaymasterClient as We}from"@zerodev/sdk";import{http as be}from"viem";function Yt(r){return!Q(r)}var De=r=>bt+Et[r];function Ft({entryPoint:r,chain:t}){return{middleware:{sponsorUserOperation:n=>i(this,[n],function*({userOperation:e}){return We({chain:nt[t],transport:be(De(t)),entryPoint:r}).sponsorUserOperation({userOperation:e,entryPoint:r})})}}}var st=class{constructor(t,e,n=new gt(new at,new ot(t))){this.crossmintWalletService=t;this.clientDecorator=e;this.accountFactory=n}getOrCreate(t,e,n){return i(this,null,function*(){let{entryPoint:a,kernelVersion:o,existingSignerConfig:s,smartContractWalletAddress:l,userId:u}=yield this.fetchConfig(t,e),p=Ve({transport:Jt(St(e))}),{account:m,signerData:f}=yield this.accountFactory.get({chain:e,walletParams:n,publicClient:p,user:E(d({},t),{id:u}),entryPoint:a,kernelVersion:o},s);if(l!=null&&!H(l,m.address))throw new w(u);s==null&&(yield this.crossmintWalletService.idempotentCreateSmartWallet(t,{type:At,smartContractWalletAddress:m.address,signerData:f,version:0,baseLayer:"evm",chainId:Le(e),entryPointVersion:a.version,kernelVersion:o}));let Y=xe(d({account:m,chain:nt[e],entryPoint:m.entryPoint,bundlerTransport:Jt(St(e))},Yt(e)&&Ft({entryPoint:m.entryPoint,chain:e}))),F=this.clientDecorator.decorate({crossmintChain:e,smartAccountClient:Y});return new $(this.crossmintWalletService,F,p,e)})}fetchConfig(t,e){return i(this,null,function*(){let{entryPointVersion:n,kernelVersion:a,signers:o,smartContractWalletAddress:s,userId:l}=yield this.crossmintWalletService.getSmartWalletConfig(t,e);if(!Mt(a))throw new c(`Unsupported kernel version. Supported versions: ${ut.join(", ")}. Version used: ${a}, Please contact support`);if(!Lt(n))throw new c(`Unsupported entry point version. Supported versions: ${yt.join(", ")}. Version used: ${n}. Please contact support`);if(n==="v0.7"&&a.startsWith("0.2")||n==="v0.6"&&a.startsWith("0.3"))throw new c(`Unsupported combination: entryPoint ${n} and kernel version ${a}. Please contact support`);return{entryPoint:{version:n,address:n==="v0.6"?ke:Ne},kernelVersion:a,userId:l,existingSignerConfig:this.getSigner(o),smartContractWalletAddress:s!=null?Me(s):void 0}})}getSigner(t){if(t.length!==0){if(t.length>1)throw new S("Invalid wallet signer configuration. Please contact support");return t[0].signerData}}},gt=class{constructor(t,e){this.eoa=t;this.passkey=e}get(t,e){if(Bt(t)){if(e!=null&&(e==null?void 0:e.type)!=="passkeys")throw new h(`Cannot create wallet with passkey signer for user '${t.user.id}', they have an existing wallet with eoa signer '${e.eoaAddress}.'`,e);return this.passkey.get(t,e)}if(e!=null&&(e==null?void 0:e.type)!=="eoa")throw new h(`Cannot create wallet with eoa signer for user '${t.user.id}', they already have a wallet with a passkey named '${e.passkeyName}' as it's signer.`,et(e));return this.eoa.get(t,e)}};import{BaseError as Ue,stringify as Ke}from"viem";var it=class{constructor(t){this.logger=t}map(t,e){return this.record(t),t instanceof c||t instanceof Ue?t:e}record(t){let e=t instanceof Error?t.message:String(t);this.logger.logError(`Smart Wallet SDK Error: ${e}`,{stack:t instanceof Error?t.stack:void 0,name:t instanceof Error?t.name:"UnknownError",details:Ke(t),domain:window.location.hostname,sdk_version:Ot})}};var Pt=class r extends R{constructor(e,n){super("SmartWalletSDK");this.smartWalletService=e;this.errorProcessor=n}static init({clientApiKey:e}){if(!J())throw new c("Smart Wallet SDK should only be used client side.");if(!Be(e).isValid)throw new Error("API key invalid");let a=new Z(e),o=new it(new C);return new r(new st(a,new tt(o)),o)}getOrCreateWallet(o,s){return i(this,arguments,function*(e,n,a={signer:{type:"PASSKEY"}}){return I("GET_OR_CREATE_WALLET",()=>i(this,null,function*(){try{return yield this.smartWalletService.getOrCreate(e,n,a)}catch(l){throw this.errorProcessor.map(l,new c(`Wallet creation failed: ${l.message}.`,$e(l)))}}),{user:e,chain:n})})}};export{U as AdminAlreadyUsedError,h as AdminMismatchError,ga as Chain,L as ConfigError,S as CrossmintServiceError,$ as EVMSmartWallet,v as JWTDecryptionError,b as JWTExpiredError,x as JWTIdentifierError,D as JWTInvalidError,K as NonCustodialWalletsNotEnabledError,A as NotAuthorizedError,M as OutOfCreditsError,V as PasskeyIncompatibleAuthenticatorError,W as PasskeyMismatchError,k as PasskeyPromptError,N as PasskeyRegistrationError,Pt as SmartWalletSDK,c as SmartWalletSDKError,O as TransferError,w as UserWalletAlreadyCreatedError,Sa as blockchainToChainId};
2
2
  //# sourceMappingURL=index.js.map