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

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,2 +1,2 @@
1
- "use strict";var H=Object.defineProperty,wt=Object.defineProperties,Ct=Object.getOwnPropertyDescriptor,bt=Object.getOwnPropertyDescriptors,kt=Object.getOwnPropertyNames,ke=Object.getOwnPropertySymbols;var xe=Object.prototype.hasOwnProperty,vt=Object.prototype.propertyIsEnumerable;var ve=(r,e,t)=>e in r?H(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,y=(r,e)=>{for(var t in e||(e={}))xe.call(e,t)&&ve(r,t,e[t]);if(ke)for(var t of ke(e))vt.call(e,t)&&ve(r,t,e[t]);return r},g=(r,e)=>wt(r,bt(e));var xt=(r,e)=>{for(var t in e)H(r,t,{get:e[t],enumerable:!0})},Wt=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of kt(e))!xe.call(r,o)&&o!==t&&H(r,o,{get:()=>e[o],enumerable:!(n=Ct(e,o))||n.enumerable});return r};var Vt=r=>Wt(H({},"__esModule",{value:!0}),r);var i=(r,e,t)=>new Promise((n,o)=>{var a=u=>{try{l(t.next(u))}catch(d){o(d)}},s=u=>{try{l(t.throw(u))}catch(d){o(d)}},l=u=>u.done?n(u.value):Promise.resolve(u.value).then(a,s);l((t=t.apply(r,e)).next())});var qt={};xt(qt,{AdminAlreadyUsedError:()=>N,AdminMismatchError:()=>h,Blockchain:()=>Pe.EVMBlockchainIncludingTestnet,ConfigError:()=>M,CrossmintServiceError:()=>f,EVMSmartWallet:()=>K,JWTDecryptionError:()=>x,JWTExpiredError:()=>k,JWTIdentifierError:()=>W,JWTInvalidError:()=>v,NonCustodialWalletsNotEnabledError:()=>B,NotAuthorizedError:()=>I,OutOfCreditsError:()=>V,PasskeyMismatchError:()=>b,SmartWalletSDK:()=>fe,SmartWalletSDKError:()=>p,TransferError:()=>C,UserWalletAlreadyCreatedError:()=>R,blockchainToChainId:()=>Pe.blockchainToChainId});module.exports=Vt(qt);var Pe=require("@crossmint/common-sdk-base");function G(){return typeof window!="undefined"}function z(){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 ge=!1,q=class{logInfo(e,t){ge&&console.log(e,t)}logError(e,t){ge&&console.error(e,t)}logWarn(e,t){ge&&console.warn(e,t)}};var We="ZeroDev";var Ve="pub035be8a594b35be1887b6ba76c4029ca",Me="http://localhost:3000/api",Ne="https://staging.crossmint.com/api",Be="https://www.crossmint.com/api",Ue="9ee29857-8077-404b-9a9a-31eeea996a4a",Ke="023d4a21-d801-4450-b629-24439ab1369d",Le="3d166617-da86-494b-9348-e8a13343bc04",$e="e9314f9e-a13d-414f-b965-c591a0248243",Je="1641cd99-c1ef-404a-9d26-a9dc67b1ba51",Ze="3cfecfb6-9d7d-4ef6-acaa-ac8f79f6cd5a",Ye="7ff22858-06f0-4f3a-8b46-5b41d8c75d0e",Fe="3b24773b-d91e-4c01-8ce5-04807463bbca",He="d54706a0-304b-419e-8a33-03c26ba3f0e9",Ge="ce986d52-4f27-4a2b-b429-eb2322f15f32",ze="6204f336-643f-41af-94e1-f8d146c91675",je="3eb830c5-f91b-48e0-bb7d-dc30103a60b2",qe="6188b92b-993e-4f39-be22-56e4806416a8",Xe="8b8b6d1a-184c-4198-8f29-c07e63aad595",Qe="5535aa3b-4f9c-45af-9c38-0072369564a3",et="b6a6db7c-65de-4f74-9d8f-f70d9c083531";var S="SCW_SDK",tt="0.1.0",Te="2024-06-09",rt="https://rpc.zerodev.app/api/v2/bundler/",nt="https://rpc.zerodev.app/api/v2/paymaster/",X="https://api.developer.coinbase.com/rpc/v1/base-sepolia/6BTAmOQZ0x1YWtI24hIKKqdHWmVP1UXf",Q="https://api.developer.coinbase.com/rpc/v1/base/6BTAmOQZ0x1YWtI24hIKKqdHWmVP1UXf";var ee=require("@datadog/browser-logs");var w=class{logInfo(e,t){Se(e,"info",t)}logError(e,t){Se(e,"error",t)}logWarn(e,t){Se(e,"warn",t)}};function Se(r,e,t){let n=t?g(y({},t),{service:S}):{service:S};Mt(),ee.datadogLogs.logger[e](r,n)}function Mt(){ee.datadogLogs.getInternalContext()==null&&ee.datadogLogs.init({clientToken:Ve,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function Nt(){return G()&&z()?new q:new w}var{logInfo:te,logWarn:pr,logError:A}=Nt();var J=require("viem");var E={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",UNCATEGORIZED:"smart-wallet:uncategorized"},p=class extends Error{constructor(e,t,n=E.UNCATEGORIZED){super(e),this.details=t,this.code=n}},C=class extends p{constructor(e){super(e,void 0,E.TRANSFER)}},f=class extends p{constructor(e,t){super(e,void 0,E.CROSSMINT_SERVICE),this.status=t}},h=class extends p{constructor(e,t,n){super(e,E.ERROR_ADMIN_MISMATCH),this.required=t,this.used=n}},b=class extends p{constructor(e,t,n){super(e,E.ERROR_PASSKEY_MISMATCH),this.required=t,this.used=n}},I=class extends p{constructor(e){super(e,void 0,E.NOT_AUTHORIZED)}},k=class extends I{constructor(t){super(`JWT provided expired at timestamp ${t}`);this.code=E.ERROR_JWT_EXPIRED;this.expiredAt=t.toISOString()}},v=class extends I{constructor(){super("Invalid JWT provided");this.code=E.ERROR_JWT_INVALID}},x=class extends I{constructor(){super("Error decrypting JWT");this.code=E.ERROR_JWT_DECRYPTION}},W=class extends I{constructor(t){super(`Missing required identifier '${t}' in the JWT`);this.code=E.ERROR_JWT_IDENTIFIER;this.identifierKey=t}},R=class extends p{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=E.ERROR_USER_WALLET_ALREADY_CREATED}},V=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,E.ERROR_OUT_OF_CREDITS)}},M=class extends p{constructor(e){super(e,void 0,E.ERROR_WALLET_CONFIG)}},N=class extends M{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=E.ERROR_ADMIN_SIGNER_ALREADY_USED}},B=class extends M{constructor(){super("Non-custodial wallets are not enabled for this project")}};var ot=require("uuid");var _=class{constructor(e,t={},n=(0,ot.v4)()){this.extraInfo=t;this.logIdempotencyKey=n;return new Proxy(this,{get:(o,a,s)=>{let l=o[a],u=`[${S} - ${e} - ${String(a)}]`;return typeof l=="function"?(...d)=>{this.logInput(d,u);let m=l.apply(o,d);return m instanceof Promise?m.then(P=>(this.logOutput(P,u),P)).catch(P=>{throw this.logError(P,u),P}):(this.logOutput(m,u),m)}:Reflect.get(o,a,s)}})}logInput(e,t){U(`${t} input - ${T(e)} - extra_info - ${T(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,g(y({args:e},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logOutput(e,t){U(`${t} output - ${T(e)} - extra_info - ${T(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,g(y({res:e},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logError(e,t){A(`${t} threw_error - ${e} - extra_info - ${T(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,y({err:e},this.extraInfo))}logPerformance(e,t){return D(e,t,this.extraInfo)}};function D(r,e,t){return i(this,null,function*(){let n=new Date().getTime(),o=yield e(),a=new Date().getTime()-n,s=y({durationInMs:a},t);return U(`[${S} - ${r} - TIME] - ${T(s)}`,{args:s}),o})}function at(r,e){return function(...t){let n=`[${S} - function: ${e}]`;U(`${n} input: ${T(t)}`,{args:t});try{let o=r.apply(this,t);return o instanceof Promise?o.then(a=>(U(`${n} output: ${T(a)}`,{res:a}),a)).catch(a=>{throw A(`${n} threw_error: ${T(a)}`,{err:a}),a}):(U(`${n} output: ${T(o)}`,{res:o}),o)}catch(o){throw A(`${n} threw_error: ${T(o)}`,{err:o}),o}}}function T(r){try{return r!=null?JSON.stringify(r,null,2):r}catch(e){return Bt(r)}}function Bt(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 U(r,e){if(z()){console.log(r);return}te(r,e)}function st(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 A("ERROR_TO_JSON_FAILED",{error:e}),new Error("[errorToJSON] err is not instanceof Error nor SyntheticBaseEvent");return JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}var re=require("viem");var it=[{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 ct({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:re.erc20Abi,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:it,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:re.erc721Abi,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var K=class extends _{constructor(t,n,o,a){super("EVMSmartWallet",{chain:a,address:n.account.address});this.crossmintService=t;this.accountClient=n;this.chain=a,this.client={wallet:n,public:o}}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(!(0,J.isAddress)(t))throw new Error(`Invalid recipient address: '${t}' is not a valid EVM address.`);if(!(0,J.isAddress)(n.token.contractAddress))throw new Error(`Invalid contract address: '${n.token.contractAddress}' is not a valid EVM address.`);let o=ct({contract:n.token.contractAddress,to:t,from:this.accountClient.account,config:n});try{let a=this.accountClient.extend(J.publicActions),{request:s}=yield a.simulateContract(o);return yield a.writeContract(s)}catch(a){A("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:S,error:st(a),tokenId:o.tokenId,contractAddress:n.token.contractAddress,chain:n.token.chain});let s=o.tokenId==null?"":`:${o.tokenId}}`;throw new C(`Error transferring token ${n.token.contractAddress}${s}`)}}))})}nfts(){return i(this,null,function*(){return this.crossmintService.fetchNFTs(this.address,this.chain)})}};var At=require("viem"),Dt=require("@crossmint/common-sdk-base");var lt=require("@crossmint/common-sdk-base");var ne=class{constructor(e={ERROR_JWT_INVALID:()=>new v,ERROR_JWT_DECRYPTION:()=>new x,ERROR_JWT_EXPIRED:({expiredAt:t})=>new k(new Date(t)),ERROR_JWT_IDENTIFIER:({identifierKey:t})=>new W(t),ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new R(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new N,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new B}){this.errors=e}throwErrorFromResponse(n){return i(this,arguments,function*({response:e,onServerErrorMessage:t}){if(!e.ok){if(e.status>=500)throw new f(t,e.status);if(e.status===402)throw new V;try{let o=yield e.json(),a=o.code;if(a!=null&&this.errors[a]!=null)throw this.errors[a](o);if(o.message!=null)throw new f(o.message,e.status)}catch(o){console.error("Error parsing response",o)}throw new f(yield e.text(),e.status)}})}};var Z=class Z extends _{constructor(e){super("BaseCrossmintService");let t=(0,lt.validateAPIKey)(e);if(!t.isValid)throw new Error("API key invalid");this.crossmintAPIHeaders={accept:"application/json","content-type":"application/json","x-api-key":e},this.crossmintBaseUrl=this.getUrlFromEnv(t.environment),this.apiErrorService=new ne}fetchCrossmintAPI(a){return i(this,arguments,function*(e,t={method:"GET"},n,o){return D("FETCH_CROSSMINT_API",()=>i(this,null,function*(){let s=`${this.crossmintBaseUrl}/${e}`,{body:l,method:u}=t,d;try{d=yield fetch(s,{body:l,method:u,headers:y(y({},this.crossmintAPIHeaders),o!=null&&{Authorization:`Bearer ${o}`})})}catch(m){throw new f(`Error fetching Crossmint API: ${m}`)}return d.ok||(yield this.apiErrorService.throwErrorFromResponse({response:d,onServerErrorMessage:n})),yield d.json()}),{endpoint:e})})}getUrlFromEnv(e){let t=Z.urlMap[e];if(!t)throw console.log(" CrossmintService.urlMap: ",Z.urlMap),new Error(`URL not found for environment: ${e}`);return t}};Z.urlMap={development:Me,staging:Ne,production:Be};var oe=Z;var Kt=require("@crossmint/common-sdk-base");var ae=class extends oe{idempotentCreateSmartWallet(e,t){return i(this,null,function*(){return this.fetchCrossmintAPI(`${Te}/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(`${Te}/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"}};var Y=require("@crossmint/common-sdk-base");function Lt(r){return[Y.EVMBlockchainIncludingTestnet.ZKYOTO,Y.EVMBlockchainIncludingTestnet.ZKATANA,Y.EVMBlockchainIncludingTestnet.ASTAR_ZKEVM,Y.EVMBlockchainIncludingTestnet.HYPERSONIC_TESTNET].includes(r)}function se(r){return Lt(r)}var Ie=require("viem");var $t=["sendTransaction","writeContract","sendUserOperation"],Jt=["signMessage","signTypedData"];function he(r){return $t.includes(r)}function Zt(r){return Jt.includes(r)}var ie=class{constructor(e){this.errorProcessor=e}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,o,a)=>{let s=Reflect.get(n,o,a);return typeof s!="function"||typeof o!="string"||!(Zt(o)||he(o))?s:(...l)=>D(`CrossmintSmartWallet.${o}`,()=>this.execute(n,o,s,l,e))}})}execute(e,t,n,o,a){return i(this,null,function*(){try{te(`[CrossmintSmartWallet.${t}] - params: ${(0,Ie.stringify)(o)}`);let s=he(t)?this.processTxnArgs(t,a,o):o;return yield n.call(e,...s)}catch(s){let l=he(t)?"signing":"sending transaction";throw this.errorProcessor.map(s,new p(`Error ${l}: ${s.message}`,(0,Ie.stringify)(s)))}})}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:a,middleware:s,account:l}]=n;return[{middleware:s,account:l,userOperation:this.addGelatoBundlerProperties(t,a)},...n.slice(1)]}let[o]=n;return[this.addGelatoBundlerProperties(t,o),...n.slice(1)]}addGelatoBundlerProperties(e,t){return se(e)?g(y({},t),{maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}):t}};function ce(r){return{pubKeyX:r.pubKeyX,pubKeyY:r.pubKeyY,passkeyName:r.passkeyName,type:"passkeys"}}var Rt=require("@zerodev/sdk"),ue=require("permissionless"),O=require("viem"),_t=require("@crossmint/common-sdk-base");var Re=["0.3.1","0.3.0","0.2.4"];function pt(r){return Re.includes(r)}var _e=["v0.6","v0.7"];function dt(r){return _e.includes(r)}var c=require("viem/chains"),Ae=require("@crossmint/common-sdk-base"),De=r=>{let e=new Map([["ethereum",Ue],["polygon",Ke],["bsc",Le],["optimism",$e],["arbitrum",Je],["ethereum-goerli",Ze],["ethereum-sepolia",Ye],["polygon-amoy",Fe],["zkatana",He],["zkyoto",Ge],["arbitrum-sepolia",Xe],["base-goerli",null],["base-sepolia",je],["bsc-testnet",null],["optimism-goerli",null],["optimism-sepolia",qe],["zora-goerli",null],["zora-sepolia",null],["base",Qe],["zora",null],["arbitrumnova",et],["astar-zkevm",ze],["apex",null]]).get(r);if(e==null)throw new Error(`ZeroDev project id not found for chain ${r}`);return e},le=r=>{switch(r){case"ethereum":return c.mainnet;case"ethereum-goerli":return c.goerli;case"ethereum-sepolia":return c.sepolia;case"polygon":return c.polygon;case"polygon-amoy":return c.polygonAmoy;case"optimism":return c.optimism;case"optimism-sepolia":return c.optimismSepolia;case"arbitrum":return c.arbitrum;case"arbitrumnova":return c.arbitrumNova;case"arbitrum-sepolia":return c.arbitrumSepolia;case"base":return c.base;case"base-sepolia":return c.baseSepolia;case"zkyoto":return c.astarZkyoto;case"astar-zkevm":return c.astarZkEVM;case"bsc":return c.bsc;default:throw new Error(`Unsupported network: ${r}`)}},Oe=r=>{switch(r){case Ae.EVMBlockchainIncludingTestnet.BASE_SEPOLIA:return X;case Ae.EVMBlockchainIncludingTestnet.BASE:return Q;default:return rt+De(r)+"?bundlerProvider=STACKUP"}};var mt=require("permissionless");var ut=at(e=>i(void 0,[e],function*({walletParams:r}){if(Yt(r.signer))return yield(0,mt.providerToSmartAccountSigner)(r.signer);if(Ft(r.signer))return r.signer.account;{let t=r.signer;throw new p(`The signer type ${t.type} is not supported`)}}),"createOwnerSigner");function Yt(r){return r&&typeof r.request=="function"}function Ft(r){return r&&r.type==="VIEM_ACCOUNT"}var yt=require("@zerodev/ecdsa-validator"),Et=require("@zerodev/sdk");var pe=class{get(u,d){return i(this,arguments,function*({chain:e,publicClient:t,entryPoint:n,walletParams:o,kernelVersion:a,user:s},l){let m=yield ut({chain:e,walletParams:o});if(l!=null&&!j(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 P=yield(0,yt.signerToEcdsaValidator)(t,{signer:m,entryPoint:n.address,kernelVersion:a});return{account:yield(0,Et.createKernelAccount)(t,{plugins:{sudo:P},index:BigInt(0),entryPoint:n.address,kernelVersion:a}),signerData:{eoaAddress:m.address,type:"eoa"}}})}};var L=require("@zerodev/passkey-validator"),ft=require("@zerodev/sdk"),Pt=require("@zerodev/webauthn-key");function gt(r){return r.walletParams.signer.type==="PASSKEY"}var de=class{constructor(e){this.crossmintService=e}get(l,u){return i(this,arguments,function*({user:e,publicClient:t,walletParams:n,entryPoint:o,kernelVersion:a},s){var be;let d=(be=n.signer.passkeyName)!=null?be:e.id;if(s!=null&&s.passkeyName!==d)throw new b(`User '${e.id}' has an existing wallet created with a passkey named '${s.passkeyName}', this does match input passkey name '${d}'.`,ce(s));let m=yield this.getPasskey(e,d,s),P=L.PasskeyValidatorContractVersion.V0_0_2,$=s==null?P:s.validatorContractVersion,F=yield(0,L.toPasskeyValidator)(t,{webAuthnKey:m,entryPoint:o.address,validatorContractVersion:$,kernelVersion:a}),Ot=yield(0,ft.createKernelAccount)(t,{plugins:{sudo:F},entryPoint:o.address,kernelVersion:a});return{signerData:this.getSignerData(F,$,d),account:Ot}})}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}:(0,Pt.toWebAuthnKey)({passkeyName:t,passkeyServerUrl:this.crossmintService.getPasskeyServerUrl(),mode:L.WebAuthnMode.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})})}getSignerData(e,t,n){return g(y({},Ht(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}`}}},Ht=r=>{let e=Gt(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function Gt(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}var Tt=require("@zerodev/sdk"),St=require("viem"),we=require("@crossmint/common-sdk-base");function ht(r){return!se(r)}var zt=r=>{switch(r){case we.EVMBlockchainIncludingTestnet.BASE_SEPOLIA:return X;case we.EVMBlockchainIncludingTestnet.BASE:return Q;default:return nt+De(r)+"?paymasterProvider=STACKUP"}};function It({entryPoint:r,chain:e}){return{middleware:{sponsorUserOperation:n=>i(this,[n],function*({userOperation:t}){return(0,Tt.createZeroDevPaymasterClient)({chain:le(e),transport:(0,St.http)(zt(e)),entryPoint:r}).sponsorUserOperation({userOperation:t,entryPoint:r})})}}}var me=class{constructor(e,t,n=new Ce(new pe,new de(e))){this.crossmintWalletService=e;this.clientDecorator=t;this.accountFactory=n}getOrCreate(e,t,n){return i(this,null,function*(){let{entryPoint:o,kernelVersion:a,existingSignerConfig:s,smartContractWalletAddress:l,userId:u}=yield this.fetchConfig(e,t),d=(0,O.createPublicClient)({transport:(0,O.http)(Oe(t))}),{account:m,signerData:P}=yield this.accountFactory.get({chain:t,walletParams:n,publicClient:d,user:g(y({},e),{id:u}),entryPoint:o,kernelVersion:a},s);if(l!=null&&!j(l,m.address))throw new R(u);s==null&&(yield this.crossmintWalletService.idempotentCreateSmartWallet(e,{type:We,smartContractWalletAddress:m.address,signerData:P,version:0,baseLayer:"evm",chainId:(0,_t.blockchainToChainId)(t),entryPointVersion:o.version,kernelVersion:a}));let $=(0,Rt.createKernelAccountClient)(y({account:m,chain:le(t),entryPoint:m.entryPoint,bundlerTransport:(0,O.http)(Oe(t))},ht(t)&&It({entryPoint:m.entryPoint,chain:t}))),F=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:$});return new K(this.crossmintWalletService,F,d,t)})}fetchConfig(e,t){return i(this,null,function*(){let{entryPointVersion:n,kernelVersion:o,signers:a,smartContractWalletAddress:s,userId:l}=yield this.crossmintWalletService.getSmartWalletConfig(e,t);if(!pt(o))throw new p(`Unsupported kernel version. Supported versions: ${Re.join(", ")}. Version used: ${o}, Please contact support`);if(!dt(n))throw new p(`Unsupported entry point version. Supported versions: ${_e.join(", ")}. Version used: ${n}. Please contact support`);if(n==="v0.7"&&o.startsWith("0.2")||n==="v0.6"&&o.startsWith("0.3"))throw new p(`Unsupported combination: entryPoint ${n} and kernel version ${o}. Please contact support`);return{entryPoint:{version:n,address:n==="v0.6"?ue.ENTRYPOINT_ADDRESS_V06:ue.ENTRYPOINT_ADDRESS_V07},kernelVersion:o,userId:l,existingSignerConfig:this.getSigner(a),smartContractWalletAddress:s!=null?(0,O.getAddress)(s):void 0}})}getSigner(e){if(e.length!==0){if(e.length>1)throw new f("Invalid wallet signer configuration. Please contact support");return e[0].signerData}}},Ce=class{constructor(e,t){this.eoa=e;this.passkey=t}get(e,t){if(gt(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.`,ce(t));return this.eoa.get(e,t)}};var Ee=require("viem");var ye=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof p||e instanceof Ee.BaseError?e:t}record(e){let t=e instanceof Error?e.message:String(e);this.logger.logError(`Smart Wallet SDK Error: ${t}`,{stack:e instanceof Error?e.stack:void 0,name:e instanceof Error?e.name:"UnknownError",details:(0,Ee.stringify)(e),domain:window.location.hostname,sdk_version:tt})}};var fe=class r extends _{constructor(t,n){super("SmartWalletSDK");this.smartWalletService=t;this.errorProcessor=n}static init({clientApiKey:t}){if(!G())throw new p("Smart Wallet SDK should only be used client side.");if(!(0,Dt.validateAPIKey)(t).isValid)throw new Error("API key invalid");let o=new ae(t),a=new ye(new w);return new r(new me(o,new ie(a)),a)}getOrCreateWallet(a,s){return i(this,arguments,function*(t,n,o={signer:{type:"PASSKEY"}}){return D("GET_OR_CREATE_WALLET",()=>i(this,null,function*(){try{return yield this.smartWalletService.getOrCreate(t,n,o)}catch(l){throw this.errorProcessor.map(l,new p(`Wallet creation failed: ${l.message}.`,(0,At.stringify)(l)))}}),{user:t,chain:n})})}};0&&(module.exports={AdminAlreadyUsedError,AdminMismatchError,Blockchain,ConfigError,CrossmintServiceError,EVMSmartWallet,JWTDecryptionError,JWTExpiredError,JWTIdentifierError,JWTInvalidError,NonCustodialWalletsNotEnabledError,NotAuthorizedError,OutOfCreditsError,PasskeyMismatchError,SmartWalletSDK,SmartWalletSDKError,TransferError,UserWalletAlreadyCreatedError,blockchainToChainId});
1
+ "use strict";var G=Object.defineProperty,mt=Object.defineProperties,dt=Object.getOwnPropertyDescriptor,ut=Object.getOwnPropertyDescriptors,yt=Object.getOwnPropertyNames,_e=Object.getOwnPropertySymbols;var Oe=Object.prototype.hasOwnProperty,ft=Object.prototype.propertyIsEnumerable;var We=(r,e,t)=>e in r?G(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,c=(r,e)=>{for(var t in e||(e={}))Oe.call(e,t)&&We(r,t,e[t]);if(_e)for(var t of _e(e))ft.call(e,t)&&We(r,t,e[t]);return r},E=(r,e)=>mt(r,ut(e));var St=(r,e)=>{for(var t in e)G(r,t,{get:e[t],enumerable:!0})},Et=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of yt(e))!Oe.call(r,a)&&a!==t&&G(r,a,{get:()=>e[a],enumerable:!(n=dt(e,a))||n.enumerable});return r};var gt=r=>Et(G({},"__esModule",{value:!0}),r);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())});var vt={};St(vt,{AdminAlreadyUsedError:()=>M,AdminMismatchError:()=>h,ConfigError:()=>L,CrossmintServiceError:()=>f,EVMSmartWallet:()=>K,JWTDecryptionError:()=>k,JWTExpiredError:()=>v,JWTIdentifierError:()=>N,JWTInvalidError:()=>x,NonCustodialWalletsNotEnabledError:()=>U,NotAuthorizedError:()=>R,OutOfCreditsError:()=>V,PasskeyMismatchError:()=>b,SmartWalletChain:()=>ge,SmartWalletSDK:()=>ye,SmartWalletSDKError:()=>p,TransferError:()=>D,UserWalletAlreadyCreatedError:()=>A,blockchainToChainId:()=>pt.blockchainToChainId});module.exports=gt(vt);var pt=require("@crossmint/common-sdk-base");function H(){return typeof window!="undefined"}function z(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function q(r,e){return(r==null?void 0:r.toLowerCase())===(e==null?void 0:e.toLowerCase())}var fe=!1,X=class{logInfo(e,t){fe&&console.log(e,t)}logError(e,t){fe&&console.error(e,t)}logWarn(e,t){fe&&console.warn(e,t)}};var De="ZeroDev";var be="pub035be8a594b35be1887b6ba76c4029ca",ve="http://localhost:3000/api",xe="https://staging.crossmint.com/api",ke="https://www.crossmint.com/api",P="SCW_SDK",Ne="0.1.0",Se="2024-06-09",Ve="https://rpc.zerodev.app/api/v2/bundler/",Le="https://rpc.zerodev.app/api/v2/paymaster/";var Z=require("@datadog/browser-logs");var O=class{logInfo(e,t){Ee(e,"info",t)}logError(e,t){Ee(e,"error",t)}logWarn(e,t){Ee(e,"warn",t)}};function Ee(r,e,t){let n=t?E(c({},t),{service:P}):{service:P};Pt(),Z.datadogLogs.logger[e](r,n)}function Pt(){Z.datadogLogs.getInternalContext()==null&&Z.datadogLogs.init({clientToken:be,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function ht(){return H()&&z()?new X:new O}var{logInfo:Q,logWarn:Yt,logError:I}=ht();var J=require("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}},D=class extends p{constructor(e){super(e,void 0,y.TRANSFER)}},f=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}},b=class extends p{constructor(e,t,n){super(e,y.ERROR_PASSKEY_MISMATCH),this.required=t,this.used=n}},R=class extends p{constructor(e){super(e,void 0,y.NOT_AUTHORIZED)}},v=class extends R{constructor(t){super(`JWT provided expired at timestamp ${t}`);this.code=y.ERROR_JWT_EXPIRED;this.expiredAt=t.toISOString()}},x=class extends R{constructor(){super("Invalid JWT provided");this.code=y.ERROR_JWT_INVALID}},k=class extends R{constructor(){super("Error decrypting JWT");this.code=y.ERROR_JWT_DECRYPTION}},N=class extends R{constructor(t){super(`Missing required identifier '${t}' in the JWT`);this.code=y.ERROR_JWT_IDENTIFIER;this.identifierKey=t}},A=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}},V=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)}},L=class extends p{constructor(e){super(e,void 0,y.ERROR_WALLET_CONFIG)}},M=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}},U=class extends L{constructor(){super("Non-custodial wallets are not enabled for this project");this.code=y.ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED}};var Me=require("uuid");var w=class{constructor(e,t={},n=(0,Me.v4)()){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(S=>(this.logOutput(S,u),S)).catch(S=>{throw this.logError(S,u),S}):(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}`,E(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}`,E(c({res:e},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logError(e,t){I(`${t} threw_error - ${e} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,c({err:e},this.extraInfo))}logPerformance(e,t){return _(e,t,this.extraInfo)}};function _(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 Ue(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 I(`${n} threw_error: ${g(o)}`,{err:o}),o}):($(`${n} output: ${g(a)}`,{res:a}),a)}catch(a){throw I(`${n} threw_error: ${g(a)}`,{err:a}),a}}}function g(r){try{return r!=null?JSON.stringify(r,null,2):r}catch(e){return Tt(r)}}function Tt(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(z()){console.log(r);return}Q(r,e)}function $e(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 I("ERROR_TO_JSON_FAILED",{error:e}),new Error("[errorToJSON] err is not instanceof Error nor SyntheticBaseEvent");return JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}var ee=require("viem");var Ke=[{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:ee.erc20Abi,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:Ke,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:ee.erc721Abi,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var K=class extends w{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(!(0,J.isAddress)(t))throw new Error(`Invalid recipient address: '${t}' is not a valid EVM address.`);if(!(0,J.isAddress)(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(J.publicActions),{request:s}=yield o.simulateContract(a);return yield o.writeContract(s)}catch(o){I("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:P,error:$e(o),tokenId:a.tokenId,contractAddress:n.token.contractAddress,chain:n.token.chain});let s=a.tokenId==null?"":`:${a.tokenId}}`;throw new D(`Error transferring token ${n.token.contractAddress}${s}`)}}))})}nfts(){return i(this,null,function*(){return this.crossmintService.fetchNFTs(this.address,this.chain)})}};var C=require("viem/chains"),T=require("@crossmint/common-sdk-base");var Fe={BASE_SEPOLIA:T.BlockchainIncludingTestnet.BASE_SEPOLIA,POLYGON_AMOY:T.BlockchainIncludingTestnet.POLYGON_AMOY},fr=(0,T.objectValues)(Fe),Je={BASE:T.BlockchainIncludingTestnet.BASE,POLYGON:T.BlockchainIncludingTestnet.POLYGON},Sr=(0,T.objectValues)(Je),ge=c(c({},Fe),Je),Er=(0,T.objectValues)(ge),Pe={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"},te={polygon:C.polygon,"polygon-amoy":C.polygonAmoy,base:C.base,"base-sepolia":C.baseSepolia},he=r=>Ve+Pe[r];var it=require("viem"),lt=require("@crossmint/common-sdk-base");var Ye=require("@crossmint/common-sdk-base");var re=class{constructor(e={ERROR_JWT_INVALID:()=>new x,ERROR_JWT_DECRYPTION:()=>new k,ERROR_JWT_EXPIRED:({expiredAt:t})=>new v(new Date(t)),ERROR_JWT_IDENTIFIER:({identifierKey:t})=>new N(t),ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new A(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new M,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new U}){this.errors=e}throwErrorFromResponse(n){return i(this,arguments,function*({response:e,onServerErrorMessage:t}){if(!e.ok){if(e.status>=500)throw new f(t,e.status);if(e.status===402)throw new V;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 f(a.message,e.status)}catch(a){if(a instanceof p)throw a;console.error("Error parsing response",a)}throw new f(yield e.text(),e.status)}})}};var Y=class Y extends w{constructor(e){super("BaseCrossmintService");let t=(0,Ye.validateAPIKey)(e);if(!t.isValid)throw new Error("API key invalid");this.crossmintAPIHeaders={accept:"application/json","content-type":"application/json","x-api-key":e},this.crossmintBaseUrl=this.getUrlFromEnv(t.environment),this.apiErrorService=new re}fetchCrossmintAPI(o){return i(this,arguments,function*(e,t={method:"GET"},n,a){return _("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 f(`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=Y.urlMap[e];if(!t)throw console.log(" CrossmintService.urlMap: ",Y.urlMap),new Error(`URL not found for environment: ${e}`);return t}};Y.urlMap={development:ve,staging:xe,production:ke};var ne=Y;var ae=class extends ne{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 oe(r){return!1}var Re=require("viem");var At=["sendTransaction","writeContract","sendUserOperation"],wt=["signMessage","signTypedData"];function Te(r){return At.includes(r)}function Ct(r){return wt.includes(r)}var se=class{constructor(e){this.errorProcessor=e}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,a,o)=>{let s=Reflect.get(n,a,o);return typeof s!="function"||typeof a!="string"||!(Ct(a)||Te(a))?s:(...l)=>_(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,s,l,e))}})}execute(e,t,n,a,o){return i(this,null,function*(){try{Q(`[CrossmintSmartWallet.${t}] - params: ${(0,Re.stringify)(a)}`);let s=Te(t)?this.processTxnArgs(t,o,a):a;return yield n.call(e,...s)}catch(s){let l=Te(t)?"signing":"sending transaction";throw this.errorProcessor.map(s,new p(`Error ${l}: ${s.message}`,(0,Re.stringify)(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 oe(e)?E(c({},t),{maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}):t}};function ie(r){return{pubKeyX:r.pubKeyX,pubKeyY:r.pubKeyY,passkeyName:r.passkeyName,type:"passkeys"}}var ot=require("@zerodev/sdk"),me=require("permissionless"),W=require("viem"),st=require("@crossmint/common-sdk-base");var Ae=["0.3.1","0.3.0","0.2.4"];function je(r){return Ae.includes(r)}var we=["v0.6","v0.7"];function Ge(r){return we.includes(r)}var He=require("permissionless");var ze=Ue(e=>i(void 0,[e],function*({walletParams:r}){if(It(r.signer))return yield(0,He.providerToSmartAccountSigner)(r.signer);if(_t(r.signer))return r.signer.account;{let t=r.signer;throw new p(`The signer type ${t.type} is not supported`)}}),"createOwnerSigner");function It(r){return r&&typeof r.request=="function"}function _t(r){return r&&r.type==="VIEM_ACCOUNT"}var qe=require("@zerodev/ecdsa-validator"),Xe=require("@zerodev/sdk");var le=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 ze({chain:e,walletParams:a});if(l!=null&&!q(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 S=yield(0,qe.signerToEcdsaValidator)(t,{signer:d,entryPoint:n.address,kernelVersion:o});return{account:yield(0,Xe.createKernelAccount)(t,{plugins:{sudo:S},index:BigInt(0),entryPoint:n.address,kernelVersion:o}),signerData:{eoaAddress:d.address,type:"eoa"}}})}};var B=require("@zerodev/passkey-validator"),Ze=require("@zerodev/sdk"),Qe=require("@zerodev/webauthn-key");function et(r){return r.walletParams.signer.type==="PASSKEY"}var pe=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 Ie;let m=(Ie=n.signer.passkeyName)!=null?Ie:e.id;if(s!=null&&s.passkeyName!==m)throw new b(`User '${e.id}' has an existing wallet created with a passkey named '${s.passkeyName}', this does match input passkey name '${m}'.`,ie(s));let d=yield this.getPasskey(e,m,s),S=B.PasskeyValidatorContractVersion.V0_0_2,F=s==null?S:s.validatorContractVersion,j=yield(0,B.toPasskeyValidator)(t,{webAuthnKey:d,entryPoint:a.address,validatorContractVersion:F,kernelVersion:o}),ct=yield(0,Ze.createKernelAccount)(t,{plugins:{sudo:j},entryPoint:a.address,kernelVersion:o});return{signerData:this.getSignerData(j,F,m),account:ct}})}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}:(0,Qe.toWebAuthnKey)({passkeyName:t,passkeyServerUrl:this.crossmintService.getPasskeyServerUrl(),mode:B.WebAuthnMode.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})})}getSignerData(e,t,n){return E(c({},Wt(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}`}}},Wt=r=>{let e=Ot(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function Ot(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}var tt=require("@zerodev/sdk"),rt=require("viem");function nt(r){return!oe(r)}var Dt=r=>Le+Pe[r];function at({entryPoint:r,chain:e}){return{middleware:{sponsorUserOperation:n=>i(this,[n],function*({userOperation:t}){return(0,tt.createZeroDevPaymasterClient)({chain:te[e],transport:(0,rt.http)(Dt(e)),entryPoint:r}).sponsorUserOperation({userOperation:t,entryPoint:r})})}}}var ce=class{constructor(e,t,n=new Ce(new le,new pe(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=(0,W.createPublicClient)({transport:(0,W.http)(he(t))}),{account:d,signerData:S}=yield this.accountFactory.get({chain:t,walletParams:n,publicClient:m,user:E(c({},e),{id:u}),entryPoint:a,kernelVersion:o},s);if(l!=null&&!q(l,d.address))throw new A(u);s==null&&(yield this.crossmintWalletService.idempotentCreateSmartWallet(e,{type:De,smartContractWalletAddress:d.address,signerData:S,version:0,baseLayer:"evm",chainId:(0,st.blockchainToChainId)(t),entryPointVersion:a.version,kernelVersion:o}));let F=(0,ot.createKernelAccountClient)(c({account:d,chain:te[t],entryPoint:d.entryPoint,bundlerTransport:(0,W.http)(he(t))},nt(t)&&at({entryPoint:d.entryPoint,chain:t}))),j=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:F});return new K(this.crossmintWalletService,j,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(!je(a))throw new p(`Unsupported kernel version. Supported versions: ${Ae.join(", ")}. Version used: ${a}, Please contact support`);if(!Ge(n))throw new p(`Unsupported entry point version. Supported versions: ${we.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"?me.ENTRYPOINT_ADDRESS_V06:me.ENTRYPOINT_ADDRESS_V07},kernelVersion:a,userId:l,existingSignerConfig:this.getSigner(o),smartContractWalletAddress:s!=null?(0,W.getAddress)(s):void 0}})}getSigner(e){if(e.length!==0){if(e.length>1)throw new f("Invalid wallet signer configuration. Please contact support");return e[0].signerData}}},Ce=class{constructor(e,t){this.eoa=e;this.passkey=t}get(e,t){if(et(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.`,ie(t));return this.eoa.get(e,t)}};var ue=require("viem");var de=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof p||e instanceof ue.BaseError?e:t}record(e){let t=e instanceof Error?e.message:String(e);this.logger.logError(`Smart Wallet SDK Error: ${t}`,{stack:e instanceof Error?e.stack:void 0,name:e instanceof Error?e.name:"UnknownError",details:(0,ue.stringify)(e),domain:window.location.hostname,sdk_version:Ne})}};var ye=class r extends w{constructor(t,n){super("SmartWalletSDK");this.smartWalletService=t;this.errorProcessor=n}static init({clientApiKey:t}){if(!H())throw new p("Smart Wallet SDK should only be used client side.");if(!(0,lt.validateAPIKey)(t).isValid)throw new Error("API key invalid");let a=new ae(t),o=new de(new O);return new r(new ce(a,new se(o)),o)}getOrCreateWallet(o,s){return i(this,arguments,function*(t,n,a={signer:{type:"PASSKEY"}}){return _("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}.`,(0,it.stringify)(l)))}}),{user:t,chain:n})})}};0&&(module.exports={AdminAlreadyUsedError,AdminMismatchError,ConfigError,CrossmintServiceError,EVMSmartWallet,JWTDecryptionError,JWTExpiredError,JWTIdentifierError,JWTInvalidError,NonCustodialWalletsNotEnabledError,NotAuthorizedError,OutOfCreditsError,PasskeyMismatchError,SmartWalletChain,SmartWalletSDK,SmartWalletSDKError,TransferError,UserWalletAlreadyCreatedError,blockchainToChainId});
2
2
  //# sourceMappingURL=index.cjs.map