@crossmint/client-sdk-smart-wallet 0.1.13 → 0.1.15
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 +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +51 -4
- package/dist/index.d.ts +51 -4
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +6 -1
- package/src/types/internal.ts +3 -3
- package/src/types/params.ts +2 -2
package/dist/index.d.cts
CHANGED
|
@@ -3,7 +3,8 @@ export { EVMBlockchainIncludingTestnet as Chain, blockchainToChainId } from '@cr
|
|
|
3
3
|
import * as _crossmint_client_sdk_base from '@crossmint/client-sdk-base';
|
|
4
4
|
import { BaseCrossmintService, APIErrorService, CrossmintSDKError, SmartWalletErrorCode } from '@crossmint/client-sdk-base';
|
|
5
5
|
export { CrossmintSDKError, CrossmintServiceError, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, NotAuthorizedError, SmartWalletErrorCode, TransferError } from '@crossmint/client-sdk-base';
|
|
6
|
-
import
|
|
6
|
+
import * as viem from 'viem';
|
|
7
|
+
import { LocalAccount, EIP1193Provider, HttpTransport, Chain, BaseError, ContractFunctionRevertedError, PublicClient, Abi, ContractFunctionName, ContractFunctionArgs, WriteContractParameters, Hex } from 'viem';
|
|
7
8
|
import { SmartAccountClient, UserOperation } from 'permissionless';
|
|
8
9
|
import { EntryPoint, GetEntryPointVersion } from 'permissionless/types/entrypoint';
|
|
9
10
|
import { z } from 'zod';
|
|
@@ -43,9 +44,9 @@ type PasskeySigner = {
|
|
|
43
44
|
*/
|
|
44
45
|
passkeyName?: string;
|
|
45
46
|
};
|
|
46
|
-
type
|
|
47
|
+
type ExternalSigner = EIP1193Provider | ViemAccount;
|
|
47
48
|
interface WalletParams {
|
|
48
|
-
signer:
|
|
49
|
+
signer: ExternalSigner | PasskeySigner;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
declare const SUPPORTED_KERNEL_VERSIONS: readonly ["0.3.1", "0.3.0", "0.2.4"];
|
|
@@ -329,6 +330,52 @@ type NFTTransferType = {
|
|
|
329
330
|
};
|
|
330
331
|
type TransferType = ERC20TransferType | SFTTransferType | NFTTransferType;
|
|
331
332
|
|
|
333
|
+
type SendTransactionFailureStage = "simulation" | "send" | "confirmation" | "execution";
|
|
334
|
+
/**
|
|
335
|
+
* Error thrown when a transaction fails to send.
|
|
336
|
+
* @param viemError The error thrown by the viem client. See https://viem.sh/docs/glossary/errors.html
|
|
337
|
+
*/
|
|
338
|
+
declare class EVMSendTransactionError extends CrossmintSDKError {
|
|
339
|
+
readonly viemError: BaseError;
|
|
340
|
+
readonly stage: SendTransactionFailureStage;
|
|
341
|
+
constructor(message: string, viemError: BaseError, stage: SendTransactionFailureStage, code?: string);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Error thrown when a transaction fails due to a contract execution error.
|
|
345
|
+
* @param viemError The error thrown by the viem client. See https://viem.sh/docs/glossary/errors.html
|
|
346
|
+
* @param data The name and arguments of the revert error from the provided ABI
|
|
347
|
+
* @param reason The revert error if it is a string and not an ABI error
|
|
348
|
+
* @example
|
|
349
|
+
* try {
|
|
350
|
+
* await wallet.executeContract({
|
|
351
|
+
* address: contractAddress,
|
|
352
|
+
* abi,
|
|
353
|
+
* functionName: "mintNFT",
|
|
354
|
+
* args: [recipientAddress],
|
|
355
|
+
* });
|
|
356
|
+
* } catch (e) {
|
|
357
|
+
* if (e instanceof SendTransactionExecutionRevertedError) {
|
|
358
|
+
* alert(`Transaction reverted: ${e.message}`);
|
|
359
|
+
* }
|
|
360
|
+
* throw e;
|
|
361
|
+
* }
|
|
362
|
+
*/
|
|
363
|
+
declare class EVMSendTransactionExecutionRevertedError extends EVMSendTransactionError {
|
|
364
|
+
readonly viemError: BaseError;
|
|
365
|
+
readonly txId: string | undefined;
|
|
366
|
+
readonly stage: SendTransactionFailureStage;
|
|
367
|
+
readonly data: {
|
|
368
|
+
abiItem: viem.AbiItem;
|
|
369
|
+
args: readonly unknown[] | undefined;
|
|
370
|
+
errorName: string;
|
|
371
|
+
} | undefined;
|
|
372
|
+
readonly reason: string | undefined;
|
|
373
|
+
constructor(message: string, viemError: BaseError, revertError: ContractFunctionRevertedError, txId: string | undefined, stage: SendTransactionFailureStage, data?: {
|
|
374
|
+
abiItem: viem.AbiItem;
|
|
375
|
+
args: readonly unknown[] | undefined;
|
|
376
|
+
errorName: string;
|
|
377
|
+
} | undefined, reason?: string | undefined);
|
|
378
|
+
}
|
|
332
379
|
interface SendTransactionOptions {
|
|
333
380
|
/**
|
|
334
381
|
* The number of confirmations to wait for before yielding the transaction hash.
|
|
@@ -480,4 +527,4 @@ declare class SmartWalletSDK {
|
|
|
480
527
|
private validChain;
|
|
481
528
|
}
|
|
482
529
|
|
|
483
|
-
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, type
|
|
530
|
+
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, type ERC20TransferType, EVMSendTransactionError, EVMSendTransactionExecutionRevertedError, EVMSmartWallet, SmartWalletChain as EVMSmartWalletChain, type ExternalSigner, type NFTTransferType, PasskeyIncompatibleAuthenticatorError, PasskeyMismatchError, PasskeyPromptError, PasskeyRegistrationError, type PasskeySigner, type SFTTransferType, SmartWalletError, SmartWalletSDK, type SmartWalletSDKInitParams, SmartWalletsNotEnabledError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ export { EVMBlockchainIncludingTestnet as Chain, blockchainToChainId } from '@cr
|
|
|
3
3
|
import * as _crossmint_client_sdk_base from '@crossmint/client-sdk-base';
|
|
4
4
|
import { BaseCrossmintService, APIErrorService, CrossmintSDKError, SmartWalletErrorCode } from '@crossmint/client-sdk-base';
|
|
5
5
|
export { CrossmintSDKError, CrossmintServiceError, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, NotAuthorizedError, SmartWalletErrorCode, TransferError } from '@crossmint/client-sdk-base';
|
|
6
|
-
import
|
|
6
|
+
import * as viem from 'viem';
|
|
7
|
+
import { LocalAccount, EIP1193Provider, HttpTransport, Chain, BaseError, ContractFunctionRevertedError, PublicClient, Abi, ContractFunctionName, ContractFunctionArgs, WriteContractParameters, Hex } from 'viem';
|
|
7
8
|
import { SmartAccountClient, UserOperation } from 'permissionless';
|
|
8
9
|
import { EntryPoint, GetEntryPointVersion } from 'permissionless/types/entrypoint';
|
|
9
10
|
import { z } from 'zod';
|
|
@@ -43,9 +44,9 @@ type PasskeySigner = {
|
|
|
43
44
|
*/
|
|
44
45
|
passkeyName?: string;
|
|
45
46
|
};
|
|
46
|
-
type
|
|
47
|
+
type ExternalSigner = EIP1193Provider | ViemAccount;
|
|
47
48
|
interface WalletParams {
|
|
48
|
-
signer:
|
|
49
|
+
signer: ExternalSigner | PasskeySigner;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
declare const SUPPORTED_KERNEL_VERSIONS: readonly ["0.3.1", "0.3.0", "0.2.4"];
|
|
@@ -329,6 +330,52 @@ type NFTTransferType = {
|
|
|
329
330
|
};
|
|
330
331
|
type TransferType = ERC20TransferType | SFTTransferType | NFTTransferType;
|
|
331
332
|
|
|
333
|
+
type SendTransactionFailureStage = "simulation" | "send" | "confirmation" | "execution";
|
|
334
|
+
/**
|
|
335
|
+
* Error thrown when a transaction fails to send.
|
|
336
|
+
* @param viemError The error thrown by the viem client. See https://viem.sh/docs/glossary/errors.html
|
|
337
|
+
*/
|
|
338
|
+
declare class EVMSendTransactionError extends CrossmintSDKError {
|
|
339
|
+
readonly viemError: BaseError;
|
|
340
|
+
readonly stage: SendTransactionFailureStage;
|
|
341
|
+
constructor(message: string, viemError: BaseError, stage: SendTransactionFailureStage, code?: string);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Error thrown when a transaction fails due to a contract execution error.
|
|
345
|
+
* @param viemError The error thrown by the viem client. See https://viem.sh/docs/glossary/errors.html
|
|
346
|
+
* @param data The name and arguments of the revert error from the provided ABI
|
|
347
|
+
* @param reason The revert error if it is a string and not an ABI error
|
|
348
|
+
* @example
|
|
349
|
+
* try {
|
|
350
|
+
* await wallet.executeContract({
|
|
351
|
+
* address: contractAddress,
|
|
352
|
+
* abi,
|
|
353
|
+
* functionName: "mintNFT",
|
|
354
|
+
* args: [recipientAddress],
|
|
355
|
+
* });
|
|
356
|
+
* } catch (e) {
|
|
357
|
+
* if (e instanceof SendTransactionExecutionRevertedError) {
|
|
358
|
+
* alert(`Transaction reverted: ${e.message}`);
|
|
359
|
+
* }
|
|
360
|
+
* throw e;
|
|
361
|
+
* }
|
|
362
|
+
*/
|
|
363
|
+
declare class EVMSendTransactionExecutionRevertedError extends EVMSendTransactionError {
|
|
364
|
+
readonly viemError: BaseError;
|
|
365
|
+
readonly txId: string | undefined;
|
|
366
|
+
readonly stage: SendTransactionFailureStage;
|
|
367
|
+
readonly data: {
|
|
368
|
+
abiItem: viem.AbiItem;
|
|
369
|
+
args: readonly unknown[] | undefined;
|
|
370
|
+
errorName: string;
|
|
371
|
+
} | undefined;
|
|
372
|
+
readonly reason: string | undefined;
|
|
373
|
+
constructor(message: string, viemError: BaseError, revertError: ContractFunctionRevertedError, txId: string | undefined, stage: SendTransactionFailureStage, data?: {
|
|
374
|
+
abiItem: viem.AbiItem;
|
|
375
|
+
args: readonly unknown[] | undefined;
|
|
376
|
+
errorName: string;
|
|
377
|
+
} | undefined, reason?: string | undefined);
|
|
378
|
+
}
|
|
332
379
|
interface SendTransactionOptions {
|
|
333
380
|
/**
|
|
334
381
|
* The number of confirmations to wait for before yielding the transaction hash.
|
|
@@ -480,4 +527,4 @@ declare class SmartWalletSDK {
|
|
|
480
527
|
private validChain;
|
|
481
528
|
}
|
|
482
529
|
|
|
483
|
-
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, type
|
|
530
|
+
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, type ERC20TransferType, EVMSendTransactionError, EVMSendTransactionExecutionRevertedError, EVMSmartWallet, SmartWalletChain as EVMSmartWalletChain, type ExternalSigner, type NFTTransferType, PasskeyIncompatibleAuthenticatorError, PasskeyMismatchError, PasskeyPromptError, PasskeyRegistrationError, type PasskeySigner, type SFTTransferType, SmartWalletError, SmartWalletSDK, type SmartWalletSDKInitParams, SmartWalletsNotEnabledError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{blockchainToChainId as ia,EVMBlockchainIncludingTestnet as oa}from"@crossmint/common-sdk-base";import{isAddress as le,publicActions as _e}from"viem";import{TransferError as Ne}from"@crossmint/client-sdk-base";import{SDKLogger as ne,getBrowserLogger as We}from"@crossmint/client-sdk-base";var re="ZeroDev";var O="SCW_SDK",I="0.1.0",R="2024-06-09",z=["0.3.1","0.3.0","0.2.4"],q=["v0.6","v0.7"];var u=new ne(O),ae=new ne(O,We(O,{onlyDatadog:!0}));import{erc20Abi as Oe,erc721Abi as Ie}from"viem";var ie=[{inputs:[{internalType:"string",name:"uri_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[]",name:"ids",type:"uint256[]"},{indexed:!1,internalType:"uint256[]",name:"values",type:"uint256[]"}],name:"TransferBatch",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"id",type:"uint256"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"TransferSingle",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"string",name:"value",type:"string"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"URI",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"id",type:"uint256"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address[]",name:"accounts",type:"address[]"},{internalType:"uint256[]",name:"ids",type:"uint256[]"}],name:"balanceOfBatch",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256[]",name:"ids",type:"uint256[]"},{internalType:"uint256[]",name:"amounts",type:"uint256[]"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeBatchTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"uri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"}];function oe({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:Oe,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:ie,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:Ie,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}import{BaseError as X,ContractFunctionRevertedError as _}from"viem";import{CrossmintSDKError as Re,WalletErrorCode as se}from"@crossmint/client-sdk-base";var h=class extends Re{constructor(t,n,a,o=se.SEND_TRANSACTION_FAILED){super(t,o);this.viemError=n;this.stage=a}},N=class extends h{constructor(t,n,a,o,i,s=a.data,p=a.reason){super(t,n,i,se.SEND_TRANSACTION_EXECUTION_REVERTED);this.viemError=n;this.txId=o;this.stage=i;this.data=s;this.reason=p}},D=class{constructor(e,t={confirmations:2,transactionConfirmationTimeout:3e4}){this.publicClient=e;this.defaultSendTransactionOptions=t}async sendTransaction(e,t,n={}){let{confirmations:a,transactionConfirmationTimeout:o}=this.getConfig(n);await this.simulateCall(e,void 0,"simulation");let i;try{i=await t.writeContract({...e,account:t.account,chain:t.chain})}catch(s){throw s instanceof X?new h(s.message,s,"send"):s}try{let s=await this.publicClient.waitForTransactionReceipt({hash:i,confirmations:a,timeout:o});return await this.handleReceipt(s,e)}catch(s){throw s instanceof X?new h(s.message,s,"confirmation"):s}}getConfig(e){return{...this.defaultSendTransactionOptions,...e}}async handleReceipt(e,t){if(e.status==="reverted")throw await this.simulateCall(t,e.transactionHash,"execution"),new N("Transaction reverted but unable to detect the reason",new _({abi:t.abi,functionName:t.functionName}),new _({abi:t.abi,functionName:t.functionName}),e.transactionHash,"execution");return e.transactionHash}async simulateCall(e,t,n){try{await this.publicClient.simulateContract({...e,account:e.address,chain:this.publicClient.chain})}catch(a){if(a instanceof X){let o=a.walk(i=>i instanceof _);throw o instanceof _?new N(o.message,a,o,t,n):new h(a.message,a,n)}throw a}}};var A=class{constructor(e,t,n,a,o=u){this.crossmintService=e;this.accountClient=t;this.logger=o;this.chain=a,this.client={wallet:t,public:n},this.sendTransactionService=new D(n)}get address(){return this.accountClient.account.address}async transferToken(e,t){return this.logger.logPerformance("TRANSFER",async()=>{if(this.chain!==t.token.chain)throw new Error(`Chain mismatch: Expected ${t.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`);if(!le(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!le(t.token.contractAddress))throw new Error(`Invalid contract address: '${t.token.contractAddress}' is not a valid EVM address.`);let n=oe({contract:t.token.contractAddress,to:e,from:this.accountClient.account,config:t});try{let a=this.accountClient.extend(_e),{request:o}=await a.simulateContract(n),i=await a.writeContract(o);return this.logger.log(`[TRANSFER] - Transaction hash from transfer: ${i}`),i}catch(a){this.logger.error("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{error:a instanceof Error?a.message:JSON.stringify(a),tokenId:n.tokenId,contractAddress:t.token.contractAddress,chain:t.token.chain});let o=n.tokenId==null?"":`:${n.tokenId}}`;throw new Ne(`Error transferring token ${t.token.contractAddress}${o}`)}},{toAddress:e,config:t})}async nfts(){return this.crossmintService.fetchNFTs(this.address,this.chain)}async executeContract({address:e,abi:t,functionName:n,args:a,value:o,config:i}){return this.sendTransactionService.sendTransaction({address:e,abi:t,functionName:n,args:a,value:o},this.accountClient,i)}};import{CrossmintSDKError as De,SmartWalletErrorCode as m}from"@crossmint/client-sdk-base";var l=class extends De{constructor(e,t,n=m.UNCATEGORIZED){super(e,n,t)}},f=class extends l{constructor(e,t,n){super(e,m.ADMIN_MISMATCH),this.required=t,this.used=n}},T=class extends l{constructor(e,t,n){super(e,m.PASSKEY_MISMATCH),this.required=t,this.used=n}},b=class extends l{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=m.USER_WALLET_ALREADY_CREATED}},x=class extends l{constructor(e){super(`Prompt was either cancelled or timed out for passkey ${e}`,void 0,m.PASSKEY_PROMPT),this.passkeyName=e}},w=class extends l{constructor(e){super(`Registration for passkey ${e} failed, either the registration took too long, or passkey signature vaildation failed.`,void 0,m.PASSKEY_REGISTRATION),this.passkeyName=e}},v=class extends l{constructor(e){super(`User selected authenticator for passkey ${e} is not compatible with Crossmint's Smart Wallets.`,void 0,m.PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=e}},S=class extends l{constructor(e){super(e,void 0,m.WALLET_CONFIG)}},W=class extends S{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=m.ADMIN_SIGNER_ALREADY_USED}},k=class extends S{constructor(){super("Smart wallets are not enabled for this project. They can be enabled on the project settings page in the developer console.");this.code=m.SMART_WALLETS_NOT_ENABLED}};import{SmartWalletErrorCode as pa,CrossmintSDKError as ma,CrossmintServiceError as da,TransferError as ua,JWTDecryptionError as ya,JWTExpiredError as ga,JWTIdentifierError as fa,JWTInvalidError as Sa,NotAuthorizedError as ha}from"@crossmint/client-sdk-base";import{stringify as Lt}from"viem";import{validateAPIKey as Kt}from"@crossmint/common-sdk-base";import{APIErrorService as He,BaseCrossmintService as Ge,CrossmintServiceError as je}from"@crossmint/client-sdk-base";import{blockchainToChainId as Je}from"@crossmint/common-sdk-base";import{PasskeyValidatorContractVersion as Me}from"@zerodev/passkey-validator";import{isAddress as Ue,isHex as Ve}from"viem";import{z as c}from"zod";var Le=c.custom(r=>Ve(r),{message:"Invalid hex string"}),M=c.custom(r=>Ue(r),{message:"Invalid evm address"}),Ke=c.object({eoaAddress:M,type:c.literal("eoa")}),$e=c.object({entryPoint:M,validatorAddress:M,pubKeyX:c.string(),pubKeyY:c.string(),authenticatorIdHash:Le,authenticatorId:c.string()}),Be=$e.extend({passkeyName:c.string(),validatorContractVersion:c.nativeEnum(Me),domain:c.string(),type:c.literal("passkeys")}),Fe=c.discriminatedUnion("type",[Be,Ke]),U=c.object({kernelVersion:c.enum(z,{errorMap:(r,e)=>({message:`Unsupported kernel version. Supported versions: ${z.join(", ")}. Version used: ${e.data}. Please contact support`})}),entryPointVersion:c.enum(q,{errorMap:(r,e)=>({message:`Unsupported entry point version. Supported versions: ${q.join(", ")}. Version used: ${e.data}. Please contact support`})}),userId:c.string().min(1),signers:c.array(c.object({signerData:Fe})).min(0).max(1,"Invalid wallet signer configuration. Please contact support"),smartContractWalletAddress:M.optional()});import{toHex as Ye}from"viem";function V(r,e){let t=e(r);return t.replace?t.value:Array.isArray(r)?r.map(n=>V(n,e)):r!==null&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([n,a])=>[n,V(a,e)])):t.value}function ce(r){return V(r,e=>typeof e=="bigint"?{value:Ye(e),replace:!0}:{value:e,replace:!1})}function pe(r){return V(r,e=>e!=null&&typeof e=="object"&&"__xm_serializedType"in e&&"value"in e&&e.__xm_serializedType==="bigint"&&typeof e.value=="string"?{value:BigInt(e.value),replace:!0}:{value:e,replace:!1})}var L=class extends Ge{constructor(){super(...arguments);this.logger=u;this.apiErrorService=new He({ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new b(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new W,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new k})}async idempotentCreateSmartWallet(t,n){await this.fetchCrossmintAPI(`${R}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(n)},"Error creating abstract wallet. Please contact support",t.jwt)}async sponsorUserOperation(t,n,a,o){let i=Je(o),s=await this.fetchCrossmintAPI(`${R}/sdk/paymaster`,{method:"POST",body:JSON.stringify({userOp:ce(n),entryPoint:a,chainId:i})},"Error sponsoring user operation. Please contact support",t.jwt);return pe(s)}async getSmartWalletConfig(t,n){let a=await this.fetchCrossmintAPI(`${R}/sdk/smart-wallet/config?chain=${n}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",t.jwt),o=U.safeParse(a);if(!o.success)throw new je(`Invalid smart wallet config, please contact support. Details below:
|
|
2
|
-
${o.error.toString()}`);return o.data}async fetchNFTs(t,n){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${n}:${t}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${t}`)}getPasskeyServerUrl(){return this.crossmintBaseUrl+"api/internal/passkeys"}};import{arbitrum as ze,arbitrumSepolia as qe,base as Xe,baseSepolia as Ze,optimism as Qe,optimismSepolia as et,polygon as tt,polygonAmoy as rt}from"viem/chains";import{BlockchainIncludingTestnet as y,objectValues as Z}from"@crossmint/common-sdk-base";var me={BASE_SEPOLIA:y.BASE_SEPOLIA,POLYGON_AMOY:y.POLYGON_AMOY,OPTIMISM_SEPOLIA:y.OPTIMISM_SEPOLIA,ARBITRUM_SEPOLIA:y.ARBITRUM_SEPOLIA},nt=Z(me),de={BASE:y.BASE,POLYGON:y.POLYGON,OPTIMISM:y.OPTIMISM,ARBITRUM:y.ARBITRUM},at=Z(de),it={...me,...de},Nr=Z(it);function ue(r){return nt.includes(r)}function ye(r){return at.includes(r)}var ge={polygon:tt,"polygon-amoy":rt,base:Xe,"base-sepolia":Ze,optimism:Qe,"optimism-sepolia":et,arbitrum:ze,"arbitrum-sepolia":qe};import{keccak256 as ot,toHex as st}from"viem";var K=class{constructor(e){this.keyPrefix=e}set(e,t){localStorage.setItem(this.key(e),JSON.stringify(t))}get(e){let t=this.key(e),n=localStorage.getItem(t);if(n==null)return null;let a=U.safeParse(JSON.parse(n));return a.success?a.data:(localStorage.removeItem(t),null)}clear(){for(let e=0;e<localStorage.length;e++){let t=localStorage.key(e);t&&t.startsWith(this.keyPrefix)&&(localStorage.removeItem(t),e--)}}key(e){return`${this.keyPrefix}-${ot(st(e.jwt))}`}};var C=class{constructor(e){this.type="passkeys";this.data=e}display(){return{pubKeyX:this.data.pubKeyX,pubKeyY:this.data.pubKeyY,passkeyName:this.data.passkeyName,type:this.type}}},P=class{constructor(e){this.type="eoa";this.data=e}display(){return this.data}};var $=class{constructor(e,t){this.crossmintService=e;this.configCache=t}async get(e,t){let n=this.configCache.get(e);if(n!=null)return{config:this.validateAndFormat(e,n),cached:!0};let a=await this.crossmintService.getSmartWalletConfig(e,t);return{config:this.validateAndFormat(e,a),cached:!1}}cache({entryPointVersion:e,kernelVersion:t,user:n,existing:a}){this.configCache.clear(),this.configCache.set(n,{entryPointVersion:e,kernelVersion:t,userId:n.id,signers:[{signerData:a.signerConfig.data}],smartContractWalletAddress:a.address})}validateAndFormat(e,{entryPointVersion:t,kernelVersion:n,signers:a,smartContractWalletAddress:o,userId:i}){if(t==="v0.7"&&n.startsWith("0.2")||t==="v0.6"&&n.startsWith("0.3"))throw new l(`Unsupported combination: entryPoint ${t} and kernel version ${n}. Please contact support`);let s=a.map(d=>d.signerData),p=this.getSigner(s);if(o!=null&&p==null||p!=null&&o==null)throw new l("Either both signer and address must be present, or both must be null");return p==null||o==null?{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:i}}:{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:i},existing:{signerConfig:p,address:o}}}getSigner(e){if(e.length===0)return;let t=e[0];if(t.type==="eoa")return new P(t);if(t.type==="passkeys")return new C(t)}};function Q(r){return"signer"in r&&"type"in r.signer&&r.signer.type==="PASSKEY"}function fe(r){let e=r.existing==null||r.existing.signerConfig.type==="passkeys";return Q(r.walletParams)&&e}function lt(r){return"signer"in r&&("type"in r.signer&&r.signer.type==="VIEM_ACCOUNT"||"request"in r.signer&&typeof r.signer.request=="function")}function Se(r){let e=r.existing==null||r.existing.signerConfig.type==="eoa";return lt(r.walletParams)&&e}var B=class{constructor(e,t){this.eoaStrategy=e;this.passkeyStrategy=t}get(e){if(fe(e))return this.passkeyStrategy.create(e);if(Se(e))return this.eoaStrategy.create(e);if(e.existing==null)throw new
|
|
3
|
-
${e.walletParams}`);let t=e.existing.signerConfig.display(),n=Q(e.walletParams)?"passkey":"eoa";throw new
|
|
4
|
-
'${JSON.stringify(t,null,2)}'`,t)}};import{signerToEcdsaValidator as dt}from"@zerodev/ecdsa-validator";import{createKernelAccount as ut}from"@zerodev/sdk";function he(r,e){return r?.toLowerCase()===e?.toLowerCase()}import{providerToSmartAccountSigner as ct}from"permissionless";async function Ce({walletParams:r}){if(pt(r.signer))return await ct(r.signer);if(mt(r.signer))return r.signer.account;{let e=r.signer;throw new l(`The signer type ${e.type} is not supported`)}}function pt(r){return r&&typeof r.request=="function"}function mt(r){return r&&r.type==="VIEM_ACCOUNT"}var F=class{async create({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:o,user:i,existing:s}){let p=await Ce({chain:e,walletParams:a});if(s!=null&&!he(p.address,s.signerConfig.data.eoaAddress))throw new
|
|
1
|
+
import{blockchainToChainId as ia,EVMBlockchainIncludingTestnet as oa}from"@crossmint/common-sdk-base";import{isAddress as le,publicActions as _e}from"viem";import{TransferError as Ne}from"@crossmint/client-sdk-base";import{SDKLogger as ne,getBrowserLogger as We}from"@crossmint/client-sdk-base";var re="ZeroDev";var O="SCW_SDK",R="0.1.0",_="2024-06-09",z=["0.3.1","0.3.0","0.2.4"],q=["v0.6","v0.7"];var u=new ne(O),ae=new ne(O,We(O,{onlyDatadog:!0}));import{erc20Abi as Ie,erc721Abi as Oe}from"viem";var ie=[{inputs:[{internalType:"string",name:"uri_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[]",name:"ids",type:"uint256[]"},{indexed:!1,internalType:"uint256[]",name:"values",type:"uint256[]"}],name:"TransferBatch",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"id",type:"uint256"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"TransferSingle",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"string",name:"value",type:"string"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"URI",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"id",type:"uint256"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address[]",name:"accounts",type:"address[]"},{internalType:"uint256[]",name:"ids",type:"uint256[]"}],name:"balanceOfBatch",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256[]",name:"ids",type:"uint256[]"},{internalType:"uint256[]",name:"amounts",type:"uint256[]"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeBatchTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"uri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"}];function oe({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:Ie,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:ie,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:Oe,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}import{BaseError as X,ContractFunctionRevertedError as N}from"viem";import{CrossmintSDKError as Re,WalletErrorCode as se}from"@crossmint/client-sdk-base";var f=class extends Re{constructor(t,n,a,o=se.SEND_TRANSACTION_FAILED){super(t,o);this.viemError=n;this.stage=a}},A=class extends f{constructor(t,n,a,o,i,s=a.data,p=a.reason){super(t,n,i,se.SEND_TRANSACTION_EXECUTION_REVERTED);this.viemError=n;this.txId=o;this.stage=i;this.data=s;this.reason=p}},D=class{constructor(e,t={confirmations:2,transactionConfirmationTimeout:3e4}){this.publicClient=e;this.defaultSendTransactionOptions=t}async sendTransaction(e,t,n={}){let{confirmations:a,transactionConfirmationTimeout:o}=this.getConfig(n);await this.simulateCall(e,void 0,"simulation");let i;try{i=await t.writeContract({...e,account:t.account,chain:t.chain})}catch(s){throw s instanceof X?new f(s.message,s,"send"):s}try{let s=await this.publicClient.waitForTransactionReceipt({hash:i,confirmations:a,timeout:o});return await this.handleReceipt(s,e)}catch(s){throw s instanceof X?new f(s.message,s,"confirmation"):s}}getConfig(e){return{...this.defaultSendTransactionOptions,...e}}async handleReceipt(e,t){if(e.status==="reverted")throw await this.simulateCall(t,e.transactionHash,"execution"),new A("Transaction reverted but unable to detect the reason",new N({abi:t.abi,functionName:t.functionName}),new N({abi:t.abi,functionName:t.functionName}),e.transactionHash,"execution");return e.transactionHash}async simulateCall(e,t,n){try{await this.publicClient.simulateContract({...e,account:e.address,chain:this.publicClient.chain})}catch(a){if(a instanceof X){let o=a.walk(i=>i instanceof N);throw o instanceof N?new A(o.message,a,o,t,n):new f(a.message,a,n)}throw a}}};var T=class{constructor(e,t,n,a,o=u){this.crossmintService=e;this.accountClient=t;this.logger=o;this.chain=a,this.client={wallet:t,public:n},this.sendTransactionService=new D(n)}get address(){return this.accountClient.account.address}async transferToken(e,t){return this.logger.logPerformance("TRANSFER",async()=>{if(this.chain!==t.token.chain)throw new Error(`Chain mismatch: Expected ${t.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`);if(!le(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!le(t.token.contractAddress))throw new Error(`Invalid contract address: '${t.token.contractAddress}' is not a valid EVM address.`);let n=oe({contract:t.token.contractAddress,to:e,from:this.accountClient.account,config:t});try{let a=this.accountClient.extend(_e),{request:o}=await a.simulateContract(n),i=await a.writeContract(o);return this.logger.log(`[TRANSFER] - Transaction hash from transfer: ${i}`),i}catch(a){this.logger.error("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{error:a instanceof Error?a.message:JSON.stringify(a),tokenId:n.tokenId,contractAddress:t.token.contractAddress,chain:t.token.chain});let o=n.tokenId==null?"":`:${n.tokenId}}`;throw new Ne(`Error transferring token ${t.token.contractAddress}${o}`)}},{toAddress:e,config:t})}async nfts(){return this.crossmintService.fetchNFTs(this.address,this.chain)}async executeContract({address:e,abi:t,functionName:n,args:a,value:o,config:i}){return this.sendTransactionService.sendTransaction({address:e,abi:t,functionName:n,args:a,value:o},this.accountClient,i)}};import{CrossmintSDKError as De,SmartWalletErrorCode as m}from"@crossmint/client-sdk-base";var l=class extends De{constructor(e,t,n=m.UNCATEGORIZED){super(e,n,t)}},S=class extends l{constructor(e,t,n){super(e,m.ADMIN_MISMATCH),this.required=t,this.used=n}},b=class extends l{constructor(e,t,n){super(e,m.PASSKEY_MISMATCH),this.required=t,this.used=n}},x=class extends l{constructor(t){super(`The user with userId ${t.toString()} already has a wallet created for this project`);this.code=m.USER_WALLET_ALREADY_CREATED}},w=class extends l{constructor(e){super(`Prompt was either cancelled or timed out for passkey ${e}`,void 0,m.PASSKEY_PROMPT),this.passkeyName=e}},v=class extends l{constructor(e){super(`Registration for passkey ${e} failed, either the registration took too long, or passkey signature vaildation failed.`,void 0,m.PASSKEY_REGISTRATION),this.passkeyName=e}},W=class extends l{constructor(e){super(`User selected authenticator for passkey ${e} is not compatible with Crossmint's Smart Wallets.`,void 0,m.PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=e}},h=class extends l{constructor(e){super(e,void 0,m.WALLET_CONFIG)}},k=class extends h{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=m.ADMIN_SIGNER_ALREADY_USED}},I=class extends h{constructor(){super("Smart wallets are not enabled for this project. They can be enabled on the project settings page in the developer console.");this.code=m.SMART_WALLETS_NOT_ENABLED}};import{SmartWalletErrorCode as ma,CrossmintSDKError as da,CrossmintServiceError as ua,TransferError as ya,JWTDecryptionError as ga,JWTExpiredError as fa,JWTIdentifierError as Sa,JWTInvalidError as ha,NotAuthorizedError as Ca}from"@crossmint/client-sdk-base";import{stringify as Lt}from"viem";import{validateAPIKey as Kt}from"@crossmint/common-sdk-base";import{APIErrorService as He,BaseCrossmintService as Ge,CrossmintServiceError as je}from"@crossmint/client-sdk-base";import{blockchainToChainId as Je}from"@crossmint/common-sdk-base";import{PasskeyValidatorContractVersion as Me}from"@zerodev/passkey-validator";import{isAddress as Ue,isHex as Ve}from"viem";import{z as c}from"zod";var Le=c.custom(r=>Ve(r),{message:"Invalid hex string"}),M=c.custom(r=>Ue(r),{message:"Invalid evm address"}),Ke=c.object({eoaAddress:M,type:c.literal("eoa")}),$e=c.object({entryPoint:M,validatorAddress:M,pubKeyX:c.string(),pubKeyY:c.string(),authenticatorIdHash:Le,authenticatorId:c.string()}),Be=$e.extend({passkeyName:c.string(),validatorContractVersion:c.nativeEnum(Me),domain:c.string(),type:c.literal("passkeys")}),Fe=c.discriminatedUnion("type",[Be,Ke]),U=c.object({kernelVersion:c.enum(z,{errorMap:(r,e)=>({message:`Unsupported kernel version. Supported versions: ${z.join(", ")}. Version used: ${e.data}. Please contact support`})}),entryPointVersion:c.enum(q,{errorMap:(r,e)=>({message:`Unsupported entry point version. Supported versions: ${q.join(", ")}. Version used: ${e.data}. Please contact support`})}),userId:c.string().min(1),signers:c.array(c.object({signerData:Fe})).min(0).max(1,"Invalid wallet signer configuration. Please contact support"),smartContractWalletAddress:M.optional()});import{toHex as Ye}from"viem";function V(r,e){let t=e(r);return t.replace?t.value:Array.isArray(r)?r.map(n=>V(n,e)):r!==null&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([n,a])=>[n,V(a,e)])):t.value}function ce(r){return V(r,e=>typeof e=="bigint"?{value:Ye(e),replace:!0}:{value:e,replace:!1})}function pe(r){return V(r,e=>e!=null&&typeof e=="object"&&"__xm_serializedType"in e&&"value"in e&&e.__xm_serializedType==="bigint"&&typeof e.value=="string"?{value:BigInt(e.value),replace:!0}:{value:e,replace:!1})}var L=class extends Ge{constructor(){super(...arguments);this.logger=u;this.apiErrorService=new He({ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new x(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new k,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new I})}async idempotentCreateSmartWallet(t,n){await this.fetchCrossmintAPI(`${_}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(n)},"Error creating abstract wallet. Please contact support",t.jwt)}async sponsorUserOperation(t,n,a,o){let i=Je(o),s=await this.fetchCrossmintAPI(`${_}/sdk/paymaster`,{method:"POST",body:JSON.stringify({userOp:ce(n),entryPoint:a,chainId:i})},"Error sponsoring user operation. Please contact support",t.jwt);return pe(s)}async getSmartWalletConfig(t,n){let a=await this.fetchCrossmintAPI(`${_}/sdk/smart-wallet/config?chain=${n}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",t.jwt),o=U.safeParse(a);if(!o.success)throw new je(`Invalid smart wallet config, please contact support. Details below:
|
|
2
|
+
${o.error.toString()}`);return o.data}async fetchNFTs(t,n){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${n}:${t}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${t}`)}getPasskeyServerUrl(){return this.crossmintBaseUrl+"api/internal/passkeys"}};import{arbitrum as ze,arbitrumSepolia as qe,base as Xe,baseSepolia as Ze,optimism as Qe,optimismSepolia as et,polygon as tt,polygonAmoy as rt}from"viem/chains";import{BlockchainIncludingTestnet as y,objectValues as Z}from"@crossmint/common-sdk-base";var me={BASE_SEPOLIA:y.BASE_SEPOLIA,POLYGON_AMOY:y.POLYGON_AMOY,OPTIMISM_SEPOLIA:y.OPTIMISM_SEPOLIA,ARBITRUM_SEPOLIA:y.ARBITRUM_SEPOLIA},nt=Z(me),de={BASE:y.BASE,POLYGON:y.POLYGON,OPTIMISM:y.OPTIMISM,ARBITRUM:y.ARBITRUM},at=Z(de),it={...me,...de},Nr=Z(it);function ue(r){return nt.includes(r)}function ye(r){return at.includes(r)}var ge={polygon:tt,"polygon-amoy":rt,base:Xe,"base-sepolia":Ze,optimism:Qe,"optimism-sepolia":et,arbitrum:ze,"arbitrum-sepolia":qe};import{keccak256 as ot,toHex as st}from"viem";var K=class{constructor(e){this.keyPrefix=e}set(e,t){localStorage.setItem(this.key(e),JSON.stringify(t))}get(e){let t=this.key(e),n=localStorage.getItem(t);if(n==null)return null;let a=U.safeParse(JSON.parse(n));return a.success?a.data:(localStorage.removeItem(t),null)}clear(){for(let e=0;e<localStorage.length;e++){let t=localStorage.key(e);t&&t.startsWith(this.keyPrefix)&&(localStorage.removeItem(t),e--)}}key(e){return`${this.keyPrefix}-${ot(st(e.jwt))}`}};var C=class{constructor(e){this.type="passkeys";this.data=e}display(){return{pubKeyX:this.data.pubKeyX,pubKeyY:this.data.pubKeyY,passkeyName:this.data.passkeyName,type:this.type}}},P=class{constructor(e){this.type="eoa";this.data=e}display(){return this.data}};var $=class{constructor(e,t){this.crossmintService=e;this.configCache=t}async get(e,t){let n=this.configCache.get(e);if(n!=null)return{config:this.validateAndFormat(e,n),cached:!0};let a=await this.crossmintService.getSmartWalletConfig(e,t);return{config:this.validateAndFormat(e,a),cached:!1}}cache({entryPointVersion:e,kernelVersion:t,user:n,existing:a}){this.configCache.clear(),this.configCache.set(n,{entryPointVersion:e,kernelVersion:t,userId:n.id,signers:[{signerData:a.signerConfig.data}],smartContractWalletAddress:a.address})}validateAndFormat(e,{entryPointVersion:t,kernelVersion:n,signers:a,smartContractWalletAddress:o,userId:i}){if(t==="v0.7"&&n.startsWith("0.2")||t==="v0.6"&&n.startsWith("0.3"))throw new l(`Unsupported combination: entryPoint ${t} and kernel version ${n}. Please contact support`);let s=a.map(d=>d.signerData),p=this.getSigner(s);if(o!=null&&p==null||p!=null&&o==null)throw new l("Either both signer and address must be present, or both must be null");return p==null||o==null?{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:i}}:{entryPointVersion:t,kernelVersion:n,userWithId:{...e,id:i},existing:{signerConfig:p,address:o}}}getSigner(e){if(e.length===0)return;let t=e[0];if(t.type==="eoa")return new P(t);if(t.type==="passkeys")return new C(t)}};function Q(r){return"signer"in r&&"type"in r.signer&&r.signer.type==="PASSKEY"}function fe(r){let e=r.existing==null||r.existing.signerConfig.type==="passkeys";return Q(r.walletParams)&&e}function lt(r){return"signer"in r&&("type"in r.signer&&r.signer.type==="VIEM_ACCOUNT"||"request"in r.signer&&typeof r.signer.request=="function")}function Se(r){let e=r.existing==null||r.existing.signerConfig.type==="eoa";return lt(r.walletParams)&&e}var B=class{constructor(e,t){this.eoaStrategy=e;this.passkeyStrategy=t}get(e){if(fe(e))return this.passkeyStrategy.create(e);if(Se(e))return this.eoaStrategy.create(e);if(e.existing==null)throw new h(`Unsupported wallet params:
|
|
3
|
+
${e.walletParams}`);let t=e.existing.signerConfig.display(),n=Q(e.walletParams)?"passkey":"eoa";throw new S(`Cannot create wallet with ${n} signer for user ${e.user.id}', they already have a wallet with signer:
|
|
4
|
+
'${JSON.stringify(t,null,2)}'`,t)}};import{signerToEcdsaValidator as dt}from"@zerodev/ecdsa-validator";import{createKernelAccount as ut}from"@zerodev/sdk";function he(r,e){return r?.toLowerCase()===e?.toLowerCase()}import{providerToSmartAccountSigner as ct}from"permissionless";async function Ce({walletParams:r}){if(pt(r.signer))return await ct(r.signer);if(mt(r.signer))return r.signer.account;{let e=r.signer;throw new l(`The signer type ${e.type} is not supported`)}}function pt(r){return r&&typeof r.request=="function"}function mt(r){return r&&r.type==="VIEM_ACCOUNT"}var F=class{async create({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:o,user:i,existing:s}){let p=await Ce({chain:e,walletParams:a});if(s!=null&&!he(p.address,s.signerConfig.data.eoaAddress))throw new S(`User '${i.id}' has an existing wallet with an eoa signer '${s.signerConfig.data.eoaAddress}', this does not match input eoa signer '${p.address}'.`,s.signerConfig.display(),{type:"eoa",eoaAddress:s.signerConfig.data.eoaAddress});let d=await dt(t,{signer:p,entryPoint:n,kernelVersion:o});return{account:await ut(t,{plugins:{sudo:d},index:0n,entryPoint:n,kernelVersion:o,deployedAccountAddress:s?.address}),signerConfig:new P({eoaAddress:p.address,type:"eoa"})}}};import{PasskeyValidatorContractVersion as yt,WebAuthnMode as gt,toPasskeyValidator as ft}from"@zerodev/passkey-validator";import{createKernelAccount as St}from"@zerodev/sdk";import{toWebAuthnKey as ht}from"@zerodev/webauthn-key";var Y=class{constructor(e,t){this.passkeyServerUrl=e;this.apiKey=t}async create({user:e,publicClient:t,walletParams:n,entryPoint:a,kernelVersion:o,existing:i}){let s=n.signer.passkeyName??e.id;if(i!=null&&i.signerConfig.data.passkeyName!==s)throw new b(`User '${e.id}' has an existing wallet created with a passkey named '${i.signerConfig.data.passkeyName}', this does match input passkey name '${s}'.`,i.signerConfig.display());try{let p=await this.getPasskey(e,s,i?.signerConfig.data),d=yt.V0_0_2,g=i==null?d:i.signerConfig.data.validatorContractVersion,E=await ft(t,{webAuthnKey:p,entryPoint:a,validatorContractVersion:g,kernelVersion:o}),ve=await St(t,{plugins:{sudo:E},entryPoint:a,kernelVersion:o,deployedAccountAddress:i?.address});return{signerConfig:this.getSignerConfig(E,g,s),account:this.decorate(ve,s)}}catch(p){throw this.mapError(p,s)}}async getPasskey(e,t,n){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:ht({passkeyName:t,passkeyServerUrl:this.passkeyServerUrl,mode:gt.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})}getSignerConfig(e,t,n){return new C({...Et(e.getSerializedData()),passkeyName:n,validatorContractVersion:t,domain:window.location.hostname,type:"passkeys"})}createPasskeysServerHeaders(e){return{"x-api-key":this.apiKey,Authorization:`Bearer ${e.jwt}`}}mapError(e,t){return e.code===0&&e.name==="DataError"?new W(t):e.message==="Registration not verified"?new v(t):e.code==="ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY"&&e.name==="NotAllowedError"?new w(t):e}decorate(e,t){return new Proxy(e,{get:(n,a,o)=>{let i=Reflect.get(n,a,o);return typeof i!="function"||typeof a!="string"||!Pt(a)?i:async(...s)=>{try{return await i.call(n,...s)}catch(p){throw this.mapError(p,t)}}}})}},Ct=["signMessage","signTypedData","signUserOperation","signTransaction"];function Pt(r){return Ct.includes(r)}var Et=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{stringify as Pe}from"viem";function H(r){return!1}var Tt=["sendTransaction","writeContract","sendUserOperation"],bt=["signMessage","signTypedData"];function ee(r){return Tt.includes(r)}function xt(r){return bt.includes(r)}var G=class{constructor(e,t=u){this.errorProcessor=e;this.logger=t}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,a,o)=>{let i=Reflect.get(n,a,o);return typeof i!="function"||typeof a!="string"||!(xt(a)||ee(a))?i:(...s)=>this.logger.logPerformance(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,i,s,e))}})}async execute(e,t,n,a,o){try{this.logger.log(`[CrossmintSmartWallet.${t}] - params: ${Pe(a)}`);let i=ee(t)?this.processTxnArgs(t,o,a):a;return await n.call(e,...i)}catch(i){let s=ee(t)?"signing":"sending transaction";throw this.errorProcessor.map(i,new l(`Error ${s}: ${i.message}`,Pe(i)))}}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:o,middleware:i,account:s}]=n;return[{middleware:i,account:s,userOperation:this.addGelatoBundlerProperties(t,o)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(t,a),...n.slice(1)]}addGelatoBundlerProperties(e,t){return H(e)?{...t,maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}:t}};import{ENTRYPOINT_ADDRESS_V06 as Ot,ENTRYPOINT_ADDRESS_V07 as Rt,createSmartAccountClient as _t}from"permissionless";import{createPimlicoBundlerClient as Nt}from"permissionless/clients/pimlico";import{createPublicClient as Dt,http as xe}from"viem";import{blockchainToChainId as Mt}from"@crossmint/common-sdk-base";import{blockchainToChainId as wt}from"@crossmint/common-sdk-base";var vt="-7M6vRDBDknwvMxnqah_jbcieWg0qad9",Wt="pim_9dKmQPxiTCvtbUNF7XFBbA",kt={polygon:"polygon-mainnet","polygon-amoy":"polygon-amoy",base:"base-mainnet","base-sepolia":"base-sepolia",optimism:"opt-mainnet","optimism-sepolia":"opt-sepolia",arbitrum:"arb-mainnet","arbitrum-sepolia":"arb-sepolia"};function Ee(r){return`https://${kt[r]}.g.alchemy.com/v2/${vt}`}function Ae(r){return`https://api.pimlico.io/v2/${wt(r)}/rpc?apikey=${Wt}`}function Te(r){return!H(r)}function be({bundlerClient:r,entryPoint:e,chain:t,walletService:n,user:a}){return{middleware:{gasPrice:async()=>(await r.getUserOperationGasPrice()).fast,sponsorUserOperation:async({userOperation:o})=>{let{sponsorUserOpParams:i}=await n.sponsorUserOperation(a,o,e,t);return i}}}}var j=class{constructor(e,t,n,a){this.crossmintService=e;this.accountConfigService=t;this.accountCreator=n;this.clientDecorator=a}async getOrCreate(e,t,n){let{config:{entryPointVersion:a,kernelVersion:o,existing:i,userWithId:s},cached:p}=await this.accountConfigService.get(e,t),d=Dt({transport:xe(Ee(t))}),{account:g,signerConfig:E}=await this.accountCreator.get({chain:t,walletParams:n,publicClient:d,user:s,entryPoint:a==="v0.6"?Ot:Rt,kernelVersion:o,existing:i});return i==null&&await this.crossmintService.idempotentCreateSmartWallet(e,{type:re,smartContractWalletAddress:g.address,signerData:E.data,version:0,baseLayer:"evm",chainId:Mt(t),entryPointVersion:a,kernelVersion:o}),p||this.accountConfigService.cache({entryPointVersion:a,kernelVersion:o,user:s,existing:{address:g.address,signerConfig:E}}),new T(this.crossmintService,this.smartAccountClient(t,g,e),d,t)}smartAccountClient(e,t,n){let a=xe(Ae(e)),o={chain:ge[e],entryPoint:t.entryPoint},i=Nt({...o,transport:a}),s=_t({account:t,bundlerTransport:a,...o,...Te(e)&&be({bundlerClient:i,entryPoint:t.entryPoint,chain:e,walletService:this.crossmintService,user:n})});return this.clientDecorator.decorate({crossmintChain:e,smartAccountClient:s})}};import{BaseError as Ut,stringify as Vt}from"viem";var J=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof l||e instanceof Ut?e:t}record(e){let t=e instanceof Error?e.message:String(e);this.logger.error(`Smart Wallet SDK Error: ${t}`,{stack:e instanceof Error?e.stack:void 0,name:e instanceof Error?e.name:"UnknownError",details:Vt(e),domain:window.location.hostname,sdk_version:R})}};function we(){return typeof window<"u"}var te=class r{constructor(e,t,n,a=u){this.crossmintEnv=e;this.smartWalletService=t;this.errorProcessor=n;this.logger=a}static init({clientApiKey:e}){let t=Kt(e);if(!t.isValid)throw new Error("API key invalid");let n=new L(e),a=new J(ae),o=new B(new F,new Y(n.getPasskeyServerUrl(),e)),i=new K(`smart-wallet-${R}`),s=new j(n,new $(n,i),o,new G(a));return new r(t.environment,s,a)}async getOrCreateWallet(e,t,n={signer:{type:"PASSKEY"}}){if(!we())throw new l("Smart Wallet SDK should only be used client side.");return this.assertValidChain(t),this.logger.logPerformance("GET_OR_CREATE_WALLET",async()=>{try{return await this.smartWalletService.getOrCreate(e,t,n)}catch(a){throw this.errorProcessor.map(a,new l(`Wallet creation failed: ${a.message}.`,Lt(a)))}})}assertValidChain(e){if(!this.validChain(e))throw new l(`The selected chain "${e}" is not available in "${this.crossmintEnv}". Either set a valid chain or check you're using an API key for the environment you're trying to target.`)}validChain(e){return this.crossmintEnv==="development"||this.crossmintEnv==="staging"?ue(e):ye(e)}};export{k as AdminAlreadyUsedError,S as AdminMismatchError,oa as Chain,h as ConfigError,da as CrossmintSDKError,ua as CrossmintServiceError,f as EVMSendTransactionError,A as EVMSendTransactionExecutionRevertedError,T as EVMSmartWallet,ga as JWTDecryptionError,fa as JWTExpiredError,Sa as JWTIdentifierError,ha as JWTInvalidError,Ca as NotAuthorizedError,W as PasskeyIncompatibleAuthenticatorError,b as PasskeyMismatchError,w as PasskeyPromptError,v as PasskeyRegistrationError,l as SmartWalletError,ma as SmartWalletErrorCode,te as SmartWalletSDK,I as SmartWalletsNotEnabledError,ya as TransferError,x as UserWalletAlreadyCreatedError,ia as blockchainToChainId};
|
|
5
5
|
//# sourceMappingURL=index.js.map
|