@crossmint/client-sdk-smart-wallet 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +34 -9
- package/dist/index.d.ts +34 -9
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +46 -45
- package/src/SmartWalletSDK.ts +3 -2
- package/src/api/APIErrorService.ts +3 -0
- package/src/api/CrossmintWalletService.ts +3 -6
- package/src/blockchain/chains.ts +43 -0
- package/src/blockchain/wallets/EVMSmartWallet.ts +3 -4
- package/src/blockchain/wallets/clientDecorator.ts +5 -5
- package/src/blockchain/wallets/passkey.ts +80 -25
- package/src/blockchain/wallets/paymaster.ts +7 -16
- package/src/blockchain/wallets/service.ts +5 -5
- package/src/error/index.ts +44 -0
- package/src/index.ts +4 -1
- package/src/types/Tokens.ts +2 -2
- package/src/types/internal.ts +2 -3
- package/src/utils/blockchain.ts +3 -13
- package/src/utils/constants.ts +0 -20
- package/src/utils/signer.ts +2 -3
- package/src/blockchain/BlockchainNetworks.ts +0 -121
- package/src/blockchain/token/index.ts +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { EVMBlockchainIncludingTestnet as
|
|
1
|
+
import { ObjectValues } from '@crossmint/common-sdk-base';
|
|
2
|
+
export { EVMBlockchainIncludingTestnet as Chain, blockchainToChainId } from '@crossmint/common-sdk-base';
|
|
3
3
|
import { LocalAccount, EIP1193Provider, HttpTransport, Chain, Hex, PublicClient } from 'viem';
|
|
4
4
|
import { PasskeyValidatorContractVersion } from '@zerodev/passkey-validator';
|
|
5
5
|
import { SmartAccountClient } from 'permissionless';
|
|
6
6
|
import { SmartAccount } from 'permissionless/accounts';
|
|
7
7
|
import { EntryPoint } from 'permissionless/types/entrypoint';
|
|
8
8
|
|
|
9
|
+
declare const SmartWalletChain: {
|
|
10
|
+
readonly BASE: "base";
|
|
11
|
+
readonly POLYGON: "polygon";
|
|
12
|
+
readonly BASE_SEPOLIA: "base-sepolia";
|
|
13
|
+
readonly POLYGON_AMOY: "polygon-amoy";
|
|
14
|
+
};
|
|
15
|
+
type SmartWalletChain = ObjectValues<typeof SmartWalletChain>;
|
|
16
|
+
|
|
9
17
|
type SmartWalletSDKInitParams = {
|
|
10
18
|
clientApiKey: string;
|
|
11
19
|
};
|
|
@@ -95,7 +103,11 @@ declare const SmartWalletErrors: {
|
|
|
95
103
|
readonly ERROR_WALLET_CONFIG: "smart-wallet:wallet-config.error";
|
|
96
104
|
readonly ERROR_ADMIN_MISMATCH: "smart-wallet:wallet-config.admin-mismatch";
|
|
97
105
|
readonly ERROR_PASSKEY_MISMATCH: "smart-wallet:wallet-config.passkey-mismatch";
|
|
106
|
+
readonly ERROR_PASSKEY_PROMPT: "smart-wallet:passkey.prompt";
|
|
107
|
+
readonly ERROR_PASSKEY_INCOMPATIBLE_AUTHENTICATOR: "smart-wallet.passkey.incompatible-authenticator";
|
|
108
|
+
readonly ERROR_PASSKEY_REGISTRATION: "smart-wallet:passkey.registration";
|
|
98
109
|
readonly ERROR_ADMIN_SIGNER_ALREADY_USED: "smart-wallet:wallet-config.admin-signer-already-used";
|
|
110
|
+
readonly ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED: "smart-wallet:wallet-config.non-custodial-wallets-not-enabled";
|
|
99
111
|
readonly UNCATEGORIZED: "smart-wallet:uncategorized";
|
|
100
112
|
};
|
|
101
113
|
type SmartWalletErrorCode = (typeof SmartWalletErrors)[keyof typeof SmartWalletErrors];
|
|
@@ -149,6 +161,18 @@ declare class UserWalletAlreadyCreatedError extends SmartWalletSDKError {
|
|
|
149
161
|
readonly code: "smart-wallet:user-wallet-already-created.error";
|
|
150
162
|
constructor(userId: string);
|
|
151
163
|
}
|
|
164
|
+
declare class PasskeyPromptError extends SmartWalletSDKError {
|
|
165
|
+
passkeyName: string;
|
|
166
|
+
constructor(passkeyName: string);
|
|
167
|
+
}
|
|
168
|
+
declare class PasskeyRegistrationError extends SmartWalletSDKError {
|
|
169
|
+
passkeyName: string;
|
|
170
|
+
constructor(passkeyName: string);
|
|
171
|
+
}
|
|
172
|
+
declare class PasskeyIncompatibleAuthenticatorError extends SmartWalletSDKError {
|
|
173
|
+
passkeyName: string;
|
|
174
|
+
constructor(passkeyName: string);
|
|
175
|
+
}
|
|
152
176
|
declare class OutOfCreditsError extends SmartWalletSDKError {
|
|
153
177
|
constructor(message?: string);
|
|
154
178
|
}
|
|
@@ -160,6 +184,7 @@ declare class AdminAlreadyUsedError extends ConfigError {
|
|
|
160
184
|
constructor();
|
|
161
185
|
}
|
|
162
186
|
declare class NonCustodialWalletsNotEnabledError extends ConfigError {
|
|
187
|
+
readonly code: "smart-wallet:wallet-config.non-custodial-wallets-not-enabled";
|
|
163
188
|
constructor();
|
|
164
189
|
}
|
|
165
190
|
|
|
@@ -188,7 +213,7 @@ declare abstract class BaseCrossmintService extends LoggerWrapper {
|
|
|
188
213
|
|
|
189
214
|
declare class CrossmintWalletService extends BaseCrossmintService {
|
|
190
215
|
idempotentCreateSmartWallet(user: UserParams, input: StoreSmartWalletParams): Promise<any>;
|
|
191
|
-
getSmartWalletConfig(user: UserParams, chain:
|
|
216
|
+
getSmartWalletConfig(user: UserParams, chain: SmartWalletChain): Promise<{
|
|
192
217
|
kernelVersion: string;
|
|
193
218
|
entryPointVersion: string;
|
|
194
219
|
userId: string;
|
|
@@ -197,12 +222,12 @@ declare class CrossmintWalletService extends BaseCrossmintService {
|
|
|
197
222
|
}[];
|
|
198
223
|
smartContractWalletAddress?: string;
|
|
199
224
|
}>;
|
|
200
|
-
fetchNFTs(address: string, chain:
|
|
225
|
+
fetchNFTs(address: string, chain: SmartWalletChain): Promise<any>;
|
|
201
226
|
getPasskeyServerUrl(): string;
|
|
202
227
|
}
|
|
203
228
|
|
|
204
229
|
interface EVMToken {
|
|
205
|
-
chain:
|
|
230
|
+
chain: SmartWalletChain;
|
|
206
231
|
contractAddress: string;
|
|
207
232
|
}
|
|
208
233
|
interface NFTEVMToken extends EVMToken {
|
|
@@ -236,7 +261,7 @@ type TransferType = ERC20TransferType | SFTTransferType | NFTTransferType;
|
|
|
236
261
|
declare class EVMSmartWallet extends LoggerWrapper {
|
|
237
262
|
private readonly crossmintService;
|
|
238
263
|
private readonly accountClient;
|
|
239
|
-
readonly chain:
|
|
264
|
+
readonly chain: SmartWalletChain;
|
|
240
265
|
/**
|
|
241
266
|
* [viem](https://viem.sh/) clients that provide an interface for core wallet functionality.
|
|
242
267
|
*/
|
|
@@ -250,7 +275,7 @@ declare class EVMSmartWallet extends LoggerWrapper {
|
|
|
250
275
|
*/
|
|
251
276
|
public: PublicClient;
|
|
252
277
|
};
|
|
253
|
-
constructor(crossmintService: CrossmintWalletService, accountClient: SmartWalletClient, publicClient: PublicClient<HttpTransport>, chain:
|
|
278
|
+
constructor(crossmintService: CrossmintWalletService, accountClient: SmartWalletClient, publicClient: PublicClient<HttpTransport>, chain: SmartWalletChain);
|
|
254
279
|
/**
|
|
255
280
|
* The address of the smart wallet.
|
|
256
281
|
*/
|
|
@@ -283,7 +308,7 @@ declare class SmartWalletSDK extends LoggerWrapper {
|
|
|
283
308
|
* const wallet = await smartWalletSDK.getOrCreateWallet({ jwt: "xxx" }, "base");
|
|
284
309
|
* ```
|
|
285
310
|
*/
|
|
286
|
-
getOrCreateWallet(user: UserParams, chain:
|
|
311
|
+
getOrCreateWallet(user: UserParams, chain: SmartWalletChain, walletParams?: WalletParams): Promise<EVMSmartWallet>;
|
|
287
312
|
}
|
|
288
313
|
|
|
289
|
-
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, CrossmintServiceError, type EOASigner, type ERC20TransferType, EVMSmartWallet, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, type NFTTransferType, NonCustodialWalletsNotEnabledError, NotAuthorizedError, OutOfCreditsError, PasskeyMismatchError, type PasskeySigner, type SFTTransferType, SmartWalletSDK, SmartWalletSDKError, type SmartWalletSDKInitParams, TransferError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
|
|
314
|
+
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, CrossmintServiceError, type EOASigner, type ERC20TransferType, EVMSmartWallet, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, type NFTTransferType, NonCustodialWalletsNotEnabledError, NotAuthorizedError, OutOfCreditsError, PasskeyIncompatibleAuthenticatorError, PasskeyMismatchError, PasskeyPromptError, PasskeyRegistrationError, type PasskeySigner, type SFTTransferType, SmartWalletSDK, SmartWalletSDKError, type SmartWalletSDKInitParams, TransferError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { EVMBlockchainIncludingTestnet as
|
|
1
|
+
import { ObjectValues } from '@crossmint/common-sdk-base';
|
|
2
|
+
export { EVMBlockchainIncludingTestnet as Chain, blockchainToChainId } from '@crossmint/common-sdk-base';
|
|
3
3
|
import { LocalAccount, EIP1193Provider, HttpTransport, Chain, Hex, PublicClient } from 'viem';
|
|
4
4
|
import { PasskeyValidatorContractVersion } from '@zerodev/passkey-validator';
|
|
5
5
|
import { SmartAccountClient } from 'permissionless';
|
|
6
6
|
import { SmartAccount } from 'permissionless/accounts';
|
|
7
7
|
import { EntryPoint } from 'permissionless/types/entrypoint';
|
|
8
8
|
|
|
9
|
+
declare const SmartWalletChain: {
|
|
10
|
+
readonly BASE: "base";
|
|
11
|
+
readonly POLYGON: "polygon";
|
|
12
|
+
readonly BASE_SEPOLIA: "base-sepolia";
|
|
13
|
+
readonly POLYGON_AMOY: "polygon-amoy";
|
|
14
|
+
};
|
|
15
|
+
type SmartWalletChain = ObjectValues<typeof SmartWalletChain>;
|
|
16
|
+
|
|
9
17
|
type SmartWalletSDKInitParams = {
|
|
10
18
|
clientApiKey: string;
|
|
11
19
|
};
|
|
@@ -95,7 +103,11 @@ declare const SmartWalletErrors: {
|
|
|
95
103
|
readonly ERROR_WALLET_CONFIG: "smart-wallet:wallet-config.error";
|
|
96
104
|
readonly ERROR_ADMIN_MISMATCH: "smart-wallet:wallet-config.admin-mismatch";
|
|
97
105
|
readonly ERROR_PASSKEY_MISMATCH: "smart-wallet:wallet-config.passkey-mismatch";
|
|
106
|
+
readonly ERROR_PASSKEY_PROMPT: "smart-wallet:passkey.prompt";
|
|
107
|
+
readonly ERROR_PASSKEY_INCOMPATIBLE_AUTHENTICATOR: "smart-wallet.passkey.incompatible-authenticator";
|
|
108
|
+
readonly ERROR_PASSKEY_REGISTRATION: "smart-wallet:passkey.registration";
|
|
98
109
|
readonly ERROR_ADMIN_SIGNER_ALREADY_USED: "smart-wallet:wallet-config.admin-signer-already-used";
|
|
110
|
+
readonly ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED: "smart-wallet:wallet-config.non-custodial-wallets-not-enabled";
|
|
99
111
|
readonly UNCATEGORIZED: "smart-wallet:uncategorized";
|
|
100
112
|
};
|
|
101
113
|
type SmartWalletErrorCode = (typeof SmartWalletErrors)[keyof typeof SmartWalletErrors];
|
|
@@ -149,6 +161,18 @@ declare class UserWalletAlreadyCreatedError extends SmartWalletSDKError {
|
|
|
149
161
|
readonly code: "smart-wallet:user-wallet-already-created.error";
|
|
150
162
|
constructor(userId: string);
|
|
151
163
|
}
|
|
164
|
+
declare class PasskeyPromptError extends SmartWalletSDKError {
|
|
165
|
+
passkeyName: string;
|
|
166
|
+
constructor(passkeyName: string);
|
|
167
|
+
}
|
|
168
|
+
declare class PasskeyRegistrationError extends SmartWalletSDKError {
|
|
169
|
+
passkeyName: string;
|
|
170
|
+
constructor(passkeyName: string);
|
|
171
|
+
}
|
|
172
|
+
declare class PasskeyIncompatibleAuthenticatorError extends SmartWalletSDKError {
|
|
173
|
+
passkeyName: string;
|
|
174
|
+
constructor(passkeyName: string);
|
|
175
|
+
}
|
|
152
176
|
declare class OutOfCreditsError extends SmartWalletSDKError {
|
|
153
177
|
constructor(message?: string);
|
|
154
178
|
}
|
|
@@ -160,6 +184,7 @@ declare class AdminAlreadyUsedError extends ConfigError {
|
|
|
160
184
|
constructor();
|
|
161
185
|
}
|
|
162
186
|
declare class NonCustodialWalletsNotEnabledError extends ConfigError {
|
|
187
|
+
readonly code: "smart-wallet:wallet-config.non-custodial-wallets-not-enabled";
|
|
163
188
|
constructor();
|
|
164
189
|
}
|
|
165
190
|
|
|
@@ -188,7 +213,7 @@ declare abstract class BaseCrossmintService extends LoggerWrapper {
|
|
|
188
213
|
|
|
189
214
|
declare class CrossmintWalletService extends BaseCrossmintService {
|
|
190
215
|
idempotentCreateSmartWallet(user: UserParams, input: StoreSmartWalletParams): Promise<any>;
|
|
191
|
-
getSmartWalletConfig(user: UserParams, chain:
|
|
216
|
+
getSmartWalletConfig(user: UserParams, chain: SmartWalletChain): Promise<{
|
|
192
217
|
kernelVersion: string;
|
|
193
218
|
entryPointVersion: string;
|
|
194
219
|
userId: string;
|
|
@@ -197,12 +222,12 @@ declare class CrossmintWalletService extends BaseCrossmintService {
|
|
|
197
222
|
}[];
|
|
198
223
|
smartContractWalletAddress?: string;
|
|
199
224
|
}>;
|
|
200
|
-
fetchNFTs(address: string, chain:
|
|
225
|
+
fetchNFTs(address: string, chain: SmartWalletChain): Promise<any>;
|
|
201
226
|
getPasskeyServerUrl(): string;
|
|
202
227
|
}
|
|
203
228
|
|
|
204
229
|
interface EVMToken {
|
|
205
|
-
chain:
|
|
230
|
+
chain: SmartWalletChain;
|
|
206
231
|
contractAddress: string;
|
|
207
232
|
}
|
|
208
233
|
interface NFTEVMToken extends EVMToken {
|
|
@@ -236,7 +261,7 @@ type TransferType = ERC20TransferType | SFTTransferType | NFTTransferType;
|
|
|
236
261
|
declare class EVMSmartWallet extends LoggerWrapper {
|
|
237
262
|
private readonly crossmintService;
|
|
238
263
|
private readonly accountClient;
|
|
239
|
-
readonly chain:
|
|
264
|
+
readonly chain: SmartWalletChain;
|
|
240
265
|
/**
|
|
241
266
|
* [viem](https://viem.sh/) clients that provide an interface for core wallet functionality.
|
|
242
267
|
*/
|
|
@@ -250,7 +275,7 @@ declare class EVMSmartWallet extends LoggerWrapper {
|
|
|
250
275
|
*/
|
|
251
276
|
public: PublicClient;
|
|
252
277
|
};
|
|
253
|
-
constructor(crossmintService: CrossmintWalletService, accountClient: SmartWalletClient, publicClient: PublicClient<HttpTransport>, chain:
|
|
278
|
+
constructor(crossmintService: CrossmintWalletService, accountClient: SmartWalletClient, publicClient: PublicClient<HttpTransport>, chain: SmartWalletChain);
|
|
254
279
|
/**
|
|
255
280
|
* The address of the smart wallet.
|
|
256
281
|
*/
|
|
@@ -283,7 +308,7 @@ declare class SmartWalletSDK extends LoggerWrapper {
|
|
|
283
308
|
* const wallet = await smartWalletSDK.getOrCreateWallet({ jwt: "xxx" }, "base");
|
|
284
309
|
* ```
|
|
285
310
|
*/
|
|
286
|
-
getOrCreateWallet(user: UserParams, chain:
|
|
311
|
+
getOrCreateWallet(user: UserParams, chain: SmartWalletChain, walletParams?: WalletParams): Promise<EVMSmartWallet>;
|
|
287
312
|
}
|
|
288
313
|
|
|
289
|
-
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, CrossmintServiceError, type EOASigner, type ERC20TransferType, EVMSmartWallet, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, type NFTTransferType, NonCustodialWalletsNotEnabledError, NotAuthorizedError, OutOfCreditsError, PasskeyMismatchError, type PasskeySigner, type SFTTransferType, SmartWalletSDK, SmartWalletSDKError, type SmartWalletSDKInitParams, TransferError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
|
|
314
|
+
export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, CrossmintServiceError, type EOASigner, type ERC20TransferType, EVMSmartWallet, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, type NFTTransferType, NonCustodialWalletsNotEnabledError, NotAuthorizedError, OutOfCreditsError, PasskeyIncompatibleAuthenticatorError, PasskeyMismatchError, PasskeyPromptError, PasskeyRegistrationError, type PasskeySigner, type SFTTransferType, SmartWalletSDK, SmartWalletSDKError, type SmartWalletSDKInitParams, TransferError, type TransferType, type UserParams, UserWalletAlreadyCreatedError, type ViemAccount, type WalletParams };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var it=Object.defineProperty,ct=Object.defineProperties;var lt=Object.getOwnPropertyDescriptors;var Te=Object.getOwnPropertySymbols;var pt=Object.prototype.hasOwnProperty,dt=Object.prototype.propertyIsEnumerable;var Se=(r,e,t)=>e in r?it(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,u=(r,e)=>{for(var t in e||(e={}))pt.call(e,t)&&Se(r,t,e[t]);if(Te)for(var t of Te(e))dt.call(e,t)&&Se(r,t,e[t]);return r},f=(r,e)=>ct(r,lt(e));var i=(r,e,t)=>new Promise((n,o)=>{var a=m=>{try{c(t.next(m))}catch(p){o(p)}},s=m=>{try{c(t.throw(m))}catch(p){o(p)}},c=m=>m.done?n(m.value):Promise.resolve(m.value).then(a,s);c((t=t.apply(r,e)).next())});import{EVMBlockchainIncludingTestnet as Ko,blockchainToChainId as Lo}from"@crossmint/common-sdk-base";function $(){return typeof window!="undefined"}function J(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function Z(r,e){return(r==null?void 0:r.toLowerCase())===(e==null?void 0:e.toLowerCase())}var ie=!1,Y=class{logInfo(e,t){ie&&console.log(e,t)}logError(e,t){ie&&console.error(e,t)}logWarn(e,t){ie&&console.warn(e,t)}};var he="ZeroDev";var Ie="pub035be8a594b35be1887b6ba76c4029ca",Re="http://localhost:3000/api",_e="https://staging.crossmint.com/api",Ae="https://www.crossmint.com/api",De="9ee29857-8077-404b-9a9a-31eeea996a4a",Oe="023d4a21-d801-4450-b629-24439ab1369d",we="3d166617-da86-494b-9348-e8a13343bc04",Ce="e9314f9e-a13d-414f-b965-c591a0248243",be="1641cd99-c1ef-404a-9d26-a9dc67b1ba51",ke="3cfecfb6-9d7d-4ef6-acaa-ac8f79f6cd5a",ve="7ff22858-06f0-4f3a-8b46-5b41d8c75d0e",xe="3b24773b-d91e-4c01-8ce5-04807463bbca",We="d54706a0-304b-419e-8a33-03c26ba3f0e9",Ve="ce986d52-4f27-4a2b-b429-eb2322f15f32",Me="6204f336-643f-41af-94e1-f8d146c91675",Ne="3eb830c5-f91b-48e0-bb7d-dc30103a60b2",Be="6188b92b-993e-4f39-be22-56e4806416a8",Ue="8b8b6d1a-184c-4198-8f29-c07e63aad595",Ke="5535aa3b-4f9c-45af-9c38-0072369564a3",Le="b6a6db7c-65de-4f74-9d8f-f70d9c083531";var T="SCW_SDK",$e="0.1.0",ce="2024-06-09",Je="https://rpc.zerodev.app/api/v2/bundler/",Ze="https://rpc.zerodev.app/api/v2/paymaster/",F="https://api.developer.coinbase.com/rpc/v1/base-sepolia/6BTAmOQZ0x1YWtI24hIKKqdHWmVP1UXf",H="https://api.developer.coinbase.com/rpc/v1/base/6BTAmOQZ0x1YWtI24hIKKqdHWmVP1UXf";import{datadogLogs as pe}from"@datadog/browser-logs";var D=class{logInfo(e,t){le(e,"info",t)}logError(e,t){le(e,"error",t)}logWarn(e,t){le(e,"warn",t)}};function le(r,e,t){let n=t?f(u({},t),{service:T}):{service:T};mt(),pe.logger[e](r,n)}function mt(){pe.getInternalContext()==null&&pe.init({clientToken:Ie,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function ut(){return $()&&J()?new Y:new D}var{logInfo:G,logWarn:Ar,logError:I}=ut();import{isAddress as ze,publicActions as Tt}from"viem";var y={NOT_AUTHORIZED:"smart-wallet:not-authorized",TRANSFER:"smart-wallet:transfer.error",CROSSMINT_SERVICE:"smart-wallet:crossmint-service.error",ERROR_JWT_EXPIRED:"smart-wallet:not-authorized.jwt-expired",ERROR_JWT_INVALID:"smart-wallet:not-authorized.jwt-invalid",ERROR_JWT_DECRYPTION:"smart-wallet:not-authorized.jwt-decryption",ERROR_JWT_IDENTIFIER:"smart-wallet:not-authorized.jwt-identifier",ERROR_USER_WALLET_ALREADY_CREATED:"smart-wallet:user-wallet-already-created.error",ERROR_OUT_OF_CREDITS:"smart-wallet:out-of-credits.error",ERROR_WALLET_CONFIG:"smart-wallet:wallet-config.error",ERROR_ADMIN_MISMATCH:"smart-wallet:wallet-config.admin-mismatch",ERROR_PASSKEY_MISMATCH:"smart-wallet:wallet-config.passkey-mismatch",ERROR_ADMIN_SIGNER_ALREADY_USED:"smart-wallet:wallet-config.admin-signer-already-used",UNCATEGORIZED:"smart-wallet:uncategorized"},l=class extends Error{constructor(e,t,n=y.UNCATEGORIZED){super(e),this.details=t,this.code=n}},C=class extends l{constructor(e){super(e,void 0,y.TRANSFER)}},P=class extends l{constructor(e,t){super(e,void 0,y.CROSSMINT_SERVICE),this.status=t}},S=class extends l{constructor(e,t,n){super(e,y.ERROR_ADMIN_MISMATCH),this.required=t,this.used=n}},b=class extends l{constructor(e,t,n){super(e,y.ERROR_PASSKEY_MISMATCH),this.required=t,this.used=n}},R=class extends l{constructor(e){super(e,void 0,y.NOT_AUTHORIZED)}},k=class extends R{constructor(t){super(`JWT provided expired at timestamp ${t}`);this.code=y.ERROR_JWT_EXPIRED;this.expiredAt=t.toISOString()}},v=class extends R{constructor(){super("Invalid JWT provided");this.code=y.ERROR_JWT_INVALID}},x=class extends R{constructor(){super("Error decrypting JWT");this.code=y.ERROR_JWT_DECRYPTION}},W=class extends R{constructor(t){super(`Missing required identifier '${t}' in the JWT`);this.code=y.ERROR_JWT_IDENTIFIER;this.identifierKey=t}},_=class extends l{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 l{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)}},M=class extends l{constructor(e){super(e,void 0,y.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=y.ERROR_ADMIN_SIGNER_ALREADY_USED}},B=class extends M{constructor(){super("Non-custodial wallets are not enabled for this project")}};import{v4 as yt}from"uuid";var h=class{constructor(e,t={},n=yt()){this.extraInfo=t;this.logIdempotencyKey=n;return new Proxy(this,{get:(o,a,s)=>{let c=o[a],m=`[${T} - ${e} - ${String(a)}]`;return typeof c=="function"?(...p)=>{this.logInput(p,m);let d=c.apply(o,p);return d instanceof Promise?d.then(E=>(this.logOutput(E,m),E)).catch(E=>{throw this.logError(E,m),E}):(this.logOutput(d,m),d)}:Reflect.get(o,a,s)}})}logInput(e,t){O(`${t} input - ${g(e)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,f(u({args:e},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logOutput(e,t){O(`${t} output - ${g(e)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,f(u({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}`,u({err:e},this.extraInfo))}logPerformance(e,t){return A(e,t,this.extraInfo)}};function A(r,e,t){return i(this,null,function*(){let n=new Date().getTime(),o=yield e(),a=new Date().getTime()-n,s=u({durationInMs:a},t);return O(`[${T} - ${r} - TIME] - ${g(s)}`,{args:s}),o})}function Ye(r,e){return function(...t){let n=`[${T} - function: ${e}]`;O(`${n} input: ${g(t)}`,{args:t});try{let o=r.apply(this,t);return o instanceof Promise?o.then(a=>(O(`${n} output: ${g(a)}`,{res:a}),a)).catch(a=>{throw I(`${n} threw_error: ${g(a)}`,{err:a}),a}):(O(`${n} output: ${g(o)}`,{res:o}),o)}catch(o){throw I(`${n} threw_error: ${g(o)}`,{err:o}),o}}}function g(r){try{return r!=null?JSON.stringify(r,null,2):r}catch(e){return Et(r)}}function Et(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 O(r,e){if(J()){console.log(r);return}G(r,e)}function Fe(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)))}import{erc20Abi as Pt,erc721Abi as gt}from"viem";var He=[{inputs:[{internalType:"string",name:"uri_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[]",name:"ids",type:"uint256[]"},{indexed:!1,internalType:"uint256[]",name:"values",type:"uint256[]"}],name:"TransferBatch",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"id",type:"uint256"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"TransferSingle",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"string",name:"value",type:"string"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"URI",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"id",type:"uint256"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address[]",name:"accounts",type:"address[]"},{internalType:"uint256[]",name:"ids",type:"uint256[]"}],name:"balanceOfBatch",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256[]",name:"ids",type:"uint256[]"},{internalType:"uint256[]",name:"amounts",type:"uint256[]"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeBatchTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"uri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"}];function Ge({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:Pt,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:He,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:gt,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var U=class extends h{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(!ze(t))throw new Error(`Invalid recipient address: '${t}' is not a valid EVM address.`);if(!ze(n.token.contractAddress))throw new Error(`Invalid contract address: '${n.token.contractAddress}' is not a valid EVM address.`);let o=Ge({contract:n.token.contractAddress,to:t,from:this.accountClient.account,config:n});try{let a=this.accountClient.extend(Tt),{request:s}=yield a.simulateContract(o);return yield a.writeContract(s)}catch(a){I("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:T,error:Fe(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)})}};import{stringify as pr}from"viem";import{validateAPIKey as dr}from"@crossmint/common-sdk-base";import{validateAPIKey as St}from"@crossmint/common-sdk-base";var z=class{constructor(e={ERROR_JWT_INVALID:()=>new v,ERROR_JWT_DECRYPTION:()=>new x,ERROR_JWT_EXPIRED:({expiredAt:t})=>new k(new Date(t)),ERROR_JWT_IDENTIFIER:({identifierKey:t})=>new W(t),ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new _(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 P(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 P(o.message,e.status)}catch(o){console.error("Error parsing response",o)}throw new P(yield e.text(),e.status)}})}};var K=class K extends h{constructor(e){super("BaseCrossmintService");let t=St(e);if(!t.isValid)throw new Error("API key invalid");this.crossmintAPIHeaders={accept:"application/json","content-type":"application/json","x-api-key":e},this.crossmintBaseUrl=this.getUrlFromEnv(t.environment),this.apiErrorService=new z}fetchCrossmintAPI(a){return i(this,arguments,function*(e,t={method:"GET"},n,o){return A("FETCH_CROSSMINT_API",()=>i(this,null,function*(){let s=`${this.crossmintBaseUrl}/${e}`,{body:c,method:m}=t,p;try{p=yield fetch(s,{body:c,method:m,headers:u(u({},this.crossmintAPIHeaders),o!=null&&{Authorization:`Bearer ${o}`})})}catch(d){throw new P(`Error fetching Crossmint API: ${d}`)}return p.ok||(yield this.apiErrorService.throwErrorFromResponse({response:p,onServerErrorMessage:n})),yield p.json()}),{endpoint:e})})}getUrlFromEnv(e){let t=K.urlMap[e];if(!t)throw console.log(" CrossmintService.urlMap: ",K.urlMap),new Error(`URL not found for environment: ${e}`);return t}};K.urlMap={development:Re,staging:_e,production:Ae};var j=K;import{EVMBlockchainIncludingTestnet as dn}from"@crossmint/common-sdk-base";var q=class extends j{idempotentCreateSmartWallet(e,t){return i(this,null,function*(){return this.fetchCrossmintAPI(`${ce}/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(`${ce}/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"}};import{EVMBlockchainIncludingTestnet as X}from"@crossmint/common-sdk-base";function ht(r){return[X.ZKYOTO,X.ZKATANA,X.ASTAR_ZKEVM,X.HYPERSONIC_TESTNET].includes(r)}function Q(r){return ht(r)}import{stringify as je}from"viem";var It=["sendTransaction","writeContract","sendUserOperation"],Rt=["signMessage","signTypedData"];function de(r){return It.includes(r)}function _t(r){return Rt.includes(r)}var ee=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"||!(_t(o)||de(o))?s:(...c)=>A(`CrossmintSmartWallet.${o}`,()=>this.execute(n,o,s,c,e))}})}execute(e,t,n,o,a){return i(this,null,function*(){try{G(`[CrossmintSmartWallet.${t}] - params: ${je(o)}`);let s=de(t)?this.processTxnArgs(t,a,o):o;return yield n.call(e,...s)}catch(s){let c=de(t)?"signing":"sending transaction";throw this.errorProcessor.map(s,new l(`Error ${c}: ${s.message}`,je(s)))}})}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:a,middleware:s,account:c}]=n;return[{middleware:s,account:c,userOperation:this.addGelatoBundlerProperties(t,a)},...n.slice(1)]}let[o]=n;return[this.addGelatoBundlerProperties(t,o),...n.slice(1)]}addGelatoBundlerProperties(e,t){return Q(e)?f(u({},t),{maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}):t}};function te(r){return{pubKeyX:r.pubKeyX,pubKeyY:r.pubKeyY,passkeyName:r.passkeyName,type:"passkeys"}}import{createKernelAccountClient as rr}from"@zerodev/sdk";import{ENTRYPOINT_ADDRESS_V06 as nr,ENTRYPOINT_ADDRESS_V07 as or}from"permissionless";import{createPublicClient as ar,getAddress as sr,http as at}from"viem";import{blockchainToChainId as ir}from"@crossmint/common-sdk-base";var me=["0.3.1","0.3.0","0.2.4"];function qe(r){return me.includes(r)}var ue=["v0.6","v0.7"];function Xe(r){return ue.includes(r)}import{arbitrum as At,arbitrumNova as Dt,arbitrumSepolia as Ot,astarZkEVM as wt,astarZkyoto as Ct,base as bt,baseSepolia as kt,bsc as vt,goerli as xt,mainnet as Wt,optimism as Vt,optimismSepolia as Mt,polygon as Nt,polygonAmoy as Bt,sepolia as Ut}from"viem/chains";import{EVMBlockchainIncludingTestnet as Qe}from"@crossmint/common-sdk-base";var ye=r=>{let e=new Map([["ethereum",De],["polygon",Oe],["bsc",we],["optimism",Ce],["arbitrum",be],["ethereum-goerli",ke],["ethereum-sepolia",ve],["polygon-amoy",xe],["zkatana",We],["zkyoto",Ve],["arbitrum-sepolia",Ue],["base-goerli",null],["base-sepolia",Ne],["bsc-testnet",null],["optimism-goerli",null],["optimism-sepolia",Be],["zora-goerli",null],["zora-sepolia",null],["base",Ke],["zora",null],["arbitrumnova",Le],["astar-zkevm",Me],["apex",null]]).get(r);if(e==null)throw new Error(`ZeroDev project id not found for chain ${r}`);return e},re=r=>{switch(r){case"ethereum":return Wt;case"ethereum-goerli":return xt;case"ethereum-sepolia":return Ut;case"polygon":return Nt;case"polygon-amoy":return Bt;case"optimism":return Vt;case"optimism-sepolia":return Mt;case"arbitrum":return At;case"arbitrumnova":return Dt;case"arbitrum-sepolia":return Ot;case"base":return bt;case"base-sepolia":return kt;case"zkyoto":return Ct;case"astar-zkevm":return wt;case"bsc":return vt;default:throw new Error(`Unsupported network: ${r}`)}},Ee=r=>{switch(r){case Qe.BASE_SEPOLIA:return F;case Qe.BASE:return H;default:return Je+ye(r)+"?bundlerProvider=STACKUP"}};import{providerToSmartAccountSigner as Kt}from"permissionless";var et=Ye(e=>i(void 0,[e],function*({walletParams:r}){if(Lt(r.signer))return yield Kt(r.signer);if($t(r.signer))return r.signer.account;{let t=r.signer;throw new l(`The signer type ${t.type} is not supported`)}}),"createOwnerSigner");function Lt(r){return r&&typeof r.request=="function"}function $t(r){return r&&r.type==="VIEM_ACCOUNT"}import{signerToEcdsaValidator as Jt}from"@zerodev/ecdsa-validator";import{createKernelAccount as Zt}from"@zerodev/sdk";var ne=class{get(m,p){return i(this,arguments,function*({chain:e,publicClient:t,entryPoint:n,walletParams:o,kernelVersion:a,user:s},c){let d=yield et({chain:e,walletParams:o});if(c!=null&&!Z(d.address,c.eoaAddress))throw new S(`User '${s.id}' has an existing wallet with an eoa signer '${c.eoaAddress}', this does not match input eoa signer '${d.address}'.`,c,{type:"eoa",eoaAddress:c.eoaAddress});let E=yield Jt(t,{signer:d,entryPoint:n.address,kernelVersion:a});return{account:yield Zt(t,{plugins:{sudo:E},index:BigInt(0),entryPoint:n.address,kernelVersion:a}),signerData:{eoaAddress:d.address,type:"eoa"}}})}};import{PasskeyValidatorContractVersion as Yt,WebAuthnMode as Ft,toPasskeyValidator as Ht}from"@zerodev/passkey-validator";import{createKernelAccount as Gt}from"@zerodev/sdk";import{toWebAuthnKey as zt}from"@zerodev/webauthn-key";function tt(r){return r.walletParams.signer.type==="PASSKEY"}var oe=class{constructor(e){this.crossmintService=e}get(c,m){return i(this,arguments,function*({user:e,publicClient:t,walletParams:n,entryPoint:o,kernelVersion:a},s){var ge;let p=(ge=n.signer.passkeyName)!=null?ge:e.id;if(s!=null&&s.passkeyName!==p)throw new b(`User '${e.id}' has an existing wallet created with a passkey named '${s.passkeyName}', this does match input passkey name '${p}'.`,te(s));let d=yield this.getPasskey(e,p,s),E=Yt.V0_0_2,w=s==null?E:s.validatorContractVersion,L=yield Ht(t,{webAuthnKey:d,entryPoint:o.address,validatorContractVersion:w,kernelVersion:a}),st=yield Gt(t,{plugins:{sudo:L},entryPoint:o.address,kernelVersion:a});return{signerData:this.getSignerData(L,w,p),account:st}})}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}:zt({passkeyName:t,passkeyServerUrl:this.crossmintService.getPasskeyServerUrl(),mode:Ft.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})})}getSignerData(e,t,n){return f(u({},jt(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}`}}},jt=r=>{let e=qt(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function qt(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}import{createZeroDevPaymasterClient as Xt}from"@zerodev/sdk";import{http as Qt}from"viem";import{EVMBlockchainIncludingTestnet as rt}from"@crossmint/common-sdk-base";function nt(r){return!Q(r)}var er=r=>{switch(r){case rt.BASE_SEPOLIA:return F;case rt.BASE:return H;default:return Ze+ye(r)+"?paymasterProvider=STACKUP"}};function ot({entryPoint:r,chain:e}){return{middleware:{sponsorUserOperation:n=>i(this,[n],function*({userOperation:t}){return Xt({chain:re(e),transport:Qt(er(e)),entryPoint:r}).sponsorUserOperation({userOperation:t,entryPoint:r})})}}}var ae=class{constructor(e,t,n=new fe(new ne,new oe(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:c,userId:m}=yield this.fetchConfig(e,t),p=ar({transport:at(Ee(t))}),{account:d,signerData:E}=yield this.accountFactory.get({chain:t,walletParams:n,publicClient:p,user:f(u({},e),{id:m}),entryPoint:o,kernelVersion:a},s);if(c!=null&&!Z(c,d.address))throw new _(m);s==null&&(yield this.crossmintWalletService.idempotentCreateSmartWallet(e,{type:he,smartContractWalletAddress:d.address,signerData:E,version:0,baseLayer:"evm",chainId:ir(t),entryPointVersion:o.version,kernelVersion:a}));let w=rr(u({account:d,chain:re(t),entryPoint:d.entryPoint,bundlerTransport:at(Ee(t))},nt(t)&&ot({entryPoint:d.entryPoint,chain:t}))),L=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:w});return new U(this.crossmintWalletService,L,p,t)})}fetchConfig(e,t){return i(this,null,function*(){let{entryPointVersion:n,kernelVersion:o,signers:a,smartContractWalletAddress:s,userId:c}=yield this.crossmintWalletService.getSmartWalletConfig(e,t);if(!qe(o))throw new l(`Unsupported kernel version. Supported versions: ${me.join(", ")}. Version used: ${o}, Please contact support`);if(!Xe(n))throw new l(`Unsupported entry point version. Supported versions: ${ue.join(", ")}. Version used: ${n}. Please contact support`);if(n==="v0.7"&&o.startsWith("0.2")||n==="v0.6"&&o.startsWith("0.3"))throw new l(`Unsupported combination: entryPoint ${n} and kernel version ${o}. Please contact support`);return{entryPoint:{version:n,address:n==="v0.6"?nr:or},kernelVersion:o,userId:c,existingSignerConfig:this.getSigner(a),smartContractWalletAddress:s!=null?sr(s):void 0}})}getSigner(e){if(e.length!==0){if(e.length>1)throw new P("Invalid wallet signer configuration. Please contact support");return e[0].signerData}}},fe=class{constructor(e,t){this.eoa=e;this.passkey=t}get(e,t){if(tt(e)){if(t!=null&&(t==null?void 0:t.type)!=="passkeys")throw new S(`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 S(`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.`,te(t));return this.eoa.get(e,t)}};import{BaseError as cr,stringify as lr}from"viem";var se=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof l||e instanceof cr?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:lr(e),domain:window.location.hostname,sdk_version:$e})}};var Pe=class r extends h{constructor(t,n){super("SmartWalletSDK");this.smartWalletService=t;this.errorProcessor=n}static init({clientApiKey:t}){if(!$())throw new l("Smart Wallet SDK should only be used client side.");if(!dr(t).isValid)throw new Error("API key invalid");let o=new q(t),a=new se(new D);return new r(new ae(o,new ee(a)),a)}getOrCreateWallet(a,s){return i(this,arguments,function*(t,n,o={signer:{type:"PASSKEY"}}){return A("GET_OR_CREATE_WALLET",()=>i(this,null,function*(){try{return yield this.smartWalletService.getOrCreate(t,n,o)}catch(c){throw this.errorProcessor.map(c,new l(`Wallet creation failed: ${c.message}.`,pr(c)))}}),{user:t,chain:n})})}};export{N as AdminAlreadyUsedError,S as AdminMismatchError,Ko as Blockchain,M as ConfigError,P as CrossmintServiceError,U as EVMSmartWallet,x as JWTDecryptionError,k as JWTExpiredError,W as JWTIdentifierError,v as JWTInvalidError,B as NonCustodialWalletsNotEnabledError,R as NotAuthorizedError,V as OutOfCreditsError,b as PasskeyMismatchError,Pe as SmartWalletSDK,l as SmartWalletSDKError,C as TransferError,_ as UserWalletAlreadyCreatedError,Lo as blockchainToChainId};
|
|
1
|
+
var Ht=Object.defineProperty,jt=Object.defineProperties;var zt=Object.getOwnPropertyDescriptors;var Rt=Object.getOwnPropertySymbols;var qt=Object.prototype.hasOwnProperty,Xt=Object.prototype.propertyIsEnumerable;var Tt=(r,t,e)=>t in r?Ht(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e,d=(r,t)=>{for(var e in t||(t={}))qt.call(t,e)&&Tt(r,e,t[e]);if(Rt)for(var e of Rt(t))Xt.call(t,e)&&Tt(r,e,t[e]);return r},E=(r,t)=>jt(r,zt(t));var i=(r,t,e)=>new Promise((n,a)=>{var o=u=>{try{l(e.next(u))}catch(p){a(p)}},s=u=>{try{l(e.throw(u))}catch(p){a(p)}},l=u=>u.done?n(u.value):Promise.resolve(u.value).then(o,s);l((e=e.apply(r,t)).next())});import{blockchainToChainId as Sa,EVMBlockchainIncludingTestnet as ga}from"@crossmint/common-sdk-base";function J(){return typeof window!="undefined"}function G(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function H(r,t){return(r==null?void 0:r.toLowerCase())===(t==null?void 0:t.toLowerCase())}var lt=!1,j=class{logInfo(t,e){lt&&console.log(t,e)}logError(t,e){lt&&console.error(t,e)}logWarn(t,e){lt&&console.warn(t,e)}};var At="ZeroDev";var wt="pub035be8a594b35be1887b6ba76c4029ca",It="http://localhost:3000/api",Ct="https://staging.crossmint.com/api",_t="https://www.crossmint.com/api",P="SCW_SDK",Ot="0.1.0",ct="2024-06-09",Wt="https://rpc.zerodev.app/api/v2/bundler/",bt="https://rpc.zerodev.app/api/v2/paymaster/";import{datadogLogs as mt}from"@datadog/browser-logs";var C=class{logInfo(t,e){pt(t,"info",e)}logError(t,e){pt(t,"error",e)}logWarn(t,e){pt(t,"warn",e)}};function pt(r,t,e){let n=e?E(d({},e),{service:P}):{service:P};Zt(),mt.logger[t](r,n)}function Zt(){mt.getInternalContext()==null&&mt.init({clientToken:wt,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function Qt(){return J()&&G()?new j:new C}var{logInfo:z,logWarn:rr,logError:T}=Qt();import{isAddress as Nt,publicActions as oe}from"viem";var y={NOT_AUTHORIZED:"smart-wallet:not-authorized",TRANSFER:"smart-wallet:transfer.error",CROSSMINT_SERVICE:"smart-wallet:crossmint-service.error",ERROR_JWT_EXPIRED:"smart-wallet:not-authorized.jwt-expired",ERROR_JWT_INVALID:"smart-wallet:not-authorized.jwt-invalid",ERROR_JWT_DECRYPTION:"smart-wallet:not-authorized.jwt-decryption",ERROR_JWT_IDENTIFIER:"smart-wallet:not-authorized.jwt-identifier",ERROR_USER_WALLET_ALREADY_CREATED:"smart-wallet:user-wallet-already-created.error",ERROR_OUT_OF_CREDITS:"smart-wallet:out-of-credits.error",ERROR_WALLET_CONFIG:"smart-wallet:wallet-config.error",ERROR_ADMIN_MISMATCH:"smart-wallet:wallet-config.admin-mismatch",ERROR_PASSKEY_MISMATCH:"smart-wallet:wallet-config.passkey-mismatch",ERROR_PASSKEY_PROMPT:"smart-wallet:passkey.prompt",ERROR_PASSKEY_INCOMPATIBLE_AUTHENTICATOR:"smart-wallet.passkey.incompatible-authenticator",ERROR_PASSKEY_REGISTRATION:"smart-wallet:passkey.registration",ERROR_ADMIN_SIGNER_ALREADY_USED:"smart-wallet:wallet-config.admin-signer-already-used",ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:"smart-wallet:wallet-config.non-custodial-wallets-not-enabled",UNCATEGORIZED:"smart-wallet:uncategorized"},c=class extends Error{constructor(t,e,n=y.UNCATEGORIZED){super(t),this.details=e,this.code=n}},O=class extends c{constructor(t){super(t,void 0,y.TRANSFER)}},S=class extends c{constructor(t,e){super(t,void 0,y.CROSSMINT_SERVICE),this.status=e}},h=class extends c{constructor(t,e,n){super(t,y.ERROR_ADMIN_MISMATCH),this.required=e,this.used=n}},W=class extends c{constructor(t,e,n){super(t,y.ERROR_PASSKEY_MISMATCH),this.required=e,this.used=n}},A=class extends c{constructor(t){super(t,void 0,y.NOT_AUTHORIZED)}},b=class extends A{constructor(e){super(`JWT provided expired at timestamp ${e}`);this.code=y.ERROR_JWT_EXPIRED;this.expiredAt=e.toISOString()}},D=class extends A{constructor(){super("Invalid JWT provided");this.code=y.ERROR_JWT_INVALID}},v=class extends A{constructor(){super("Error decrypting JWT");this.code=y.ERROR_JWT_DECRYPTION}},x=class extends A{constructor(e){super(`Missing required identifier '${e}' in the JWT`);this.code=y.ERROR_JWT_IDENTIFIER;this.identifierKey=e}},w=class extends c{constructor(e){super(`The user with userId ${e.toString()} already has a wallet created for this project`);this.code=y.ERROR_USER_WALLET_ALREADY_CREATED}},k=class extends c{constructor(t){super(`Prompt was either cancelled or timed out for passkey ${t}`,void 0,y.ERROR_PASSKEY_PROMPT),this.passkeyName=t}},N=class extends c{constructor(t){super(`Registration for passkey ${t} failed, either the registration took too long, or passkey signature vaildation failed.`,void 0,y.ERROR_PASSKEY_REGISTRATION),this.passkeyName=t}},V=class extends c{constructor(t){super(`User selected authenticator for passkey ${t} is not compatible with Crossmint's Smart Wallets.`,void 0,y.ERROR_PASSKEY_INCOMPATIBLE_AUTHENTICATOR),this.passkeyName=t}},M=class extends c{constructor(t){super("You've run out of Crossmint API credits. Visit https://docs.crossmint.com/docs/errors for more information",void 0,y.ERROR_OUT_OF_CREDITS)}},L=class extends c{constructor(t){super(t,void 0,y.ERROR_WALLET_CONFIG)}},U=class extends L{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=y.ERROR_ADMIN_SIGNER_ALREADY_USED}},K=class extends L{constructor(){super("Non-custodial wallets are not enabled for this project");this.code=y.ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED}};import{v4 as te}from"uuid";var R=class{constructor(t,e={},n=te()){this.extraInfo=e;this.logIdempotencyKey=n;return new Proxy(this,{get:(a,o,s)=>{let l=a[o],u=`[${P} - ${t} - ${String(o)}]`;return typeof l=="function"?(...p)=>{this.logInput(p,u);let m=l.apply(a,p);return m instanceof Promise?m.then(f=>(this.logOutput(f,u),f)).catch(f=>{throw this.logError(f,u),f}):(this.logOutput(m,u),m)}:Reflect.get(a,o,s)}})}logInput(t,e){_(`${e} input - ${g(t)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,E(d({args:t},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logOutput(t,e){_(`${e} output - ${g(t)} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,E(d({res:t},this.extraInfo),{logIdempotencyKey:this.logIdempotencyKey}))}logError(t,e){T(`${e} threw_error - ${t} - extra_info - ${g(this.extraInfo)} - log_idempotency_key - ${this.logIdempotencyKey}`,d({err:t},this.extraInfo))}logPerformance(t,e){return I(t,e,this.extraInfo)}};function I(r,t,e){return i(this,null,function*(){let n=new Date().getTime(),a=yield t(),o=new Date().getTime()-n,s=d({durationInMs:o},e);return _(`[${P} - ${r} - TIME] - ${g(s)}`,{args:s}),a})}function Dt(r,t){return function(...e){let n=`[${P} - function: ${t}]`;_(`${n} input: ${g(e)}`,{args:e});try{let a=r.apply(this,e);return a instanceof Promise?a.then(o=>(_(`${n} output: ${g(o)}`,{res:o}),o)).catch(o=>{throw T(`${n} threw_error: ${g(o)}`,{err:o}),o}):(_(`${n} output: ${g(a)}`,{res:a}),a)}catch(a){throw T(`${n} threw_error: ${g(a)}`,{err:a}),a}}}function g(r){try{return r!=null?JSON.stringify(r,null,2):r}catch(t){return ee(r)}}function ee(r){let t={};for(let e in r)Object.prototype.hasOwnProperty.call(r,e)&&typeof r[e]!="object"&&typeof r[e]!="function"&&(t[e]=r[e]);return JSON.stringify(t,null,2)}function _(r,t){if(G()){console.log(r);return}z(r,t)}function vt(r){var e;let t=r instanceof Error?r:{message:"Unknown error",name:"Unknown error"};if(!(t instanceof Error)&&((e=t.constructor)==null?void 0:e.name)!=="SyntheticBaseEvent")throw T("ERROR_TO_JSON_FAILED",{error:t}),new Error("[errorToJSON] err is not instanceof Error nor SyntheticBaseEvent");return JSON.parse(JSON.stringify(t,Object.getOwnPropertyNames(t)))}import{erc20Abi as ne,erc721Abi as ae}from"viem";var xt=[{inputs:[{internalType:"string",name:"uri_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[]",name:"ids",type:"uint256[]"},{indexed:!1,internalType:"uint256[]",name:"values",type:"uint256[]"}],name:"TransferBatch",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"id",type:"uint256"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"TransferSingle",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"string",name:"value",type:"string"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"URI",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"id",type:"uint256"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address[]",name:"accounts",type:"address[]"},{internalType:"uint256[]",name:"ids",type:"uint256[]"}],name:"balanceOfBatch",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256[]",name:"ids",type:"uint256[]"},{internalType:"uint256[]",name:"amounts",type:"uint256[]"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeBatchTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"uri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"}];function kt({contract:r,config:t,from:e,to:n}){switch(t.token.type){case"ft":return{account:e,address:r,abi:ne,functionName:"transfer",args:[n,t.amount]};case"sft":return{account:e,address:r,abi:xt,functionName:"safeTransferFrom",args:[e.address,n,t.token.tokenId,t.quantity,"0x00"],tokenId:t.token.tokenId};case"nft":return{account:e,address:r,abi:ae,functionName:"safeTransferFrom",args:[e.address,n,t.token.tokenId],tokenId:t.token.tokenId}}}var $=class extends R{constructor(e,n,a,o){super("EVMSmartWallet",{chain:o,address:n.account.address});this.crossmintService=e;this.accountClient=n;this.chain=o,this.client={wallet:n,public:a}}get address(){return this.accountClient.account.address}transferToken(e,n){return i(this,null,function*(){return this.logPerformance("TRANSFER",()=>i(this,null,function*(){if(this.chain!==n.token.chain)throw new Error(`Chain mismatch: Expected ${n.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`);if(!Nt(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!Nt(n.token.contractAddress))throw new Error(`Invalid contract address: '${n.token.contractAddress}' is not a valid EVM address.`);let a=kt({contract:n.token.contractAddress,to:e,from:this.accountClient.account,config:n});try{let o=this.accountClient.extend(oe),{request:s}=yield o.simulateContract(a);return yield o.writeContract(s)}catch(o){T("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:P,error:vt(o),tokenId:a.tokenId,contractAddress:n.token.contractAddress,chain:n.token.chain});let s=a.tokenId==null?"":`:${a.tokenId}}`;throw new O(`Error transferring token ${n.token.contractAddress}${s}`)}}))})}nfts(){return i(this,null,function*(){return this.crossmintService.fetchNFTs(this.address,this.chain)})}};import{stringify as $e}from"viem";import{validateAPIKey as Be}from"@crossmint/common-sdk-base";import{validateAPIKey as se}from"@crossmint/common-sdk-base";var q=class{constructor(t={ERROR_JWT_INVALID:()=>new D,ERROR_JWT_DECRYPTION:()=>new v,ERROR_JWT_EXPIRED:({expiredAt:e})=>new b(new Date(e)),ERROR_JWT_IDENTIFIER:({identifierKey:e})=>new x(e),ERROR_USER_WALLET_ALREADY_CREATED:({userId:e})=>new w(e),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new U,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new K}){this.errors=t}throwErrorFromResponse(n){return i(this,arguments,function*({response:t,onServerErrorMessage:e}){if(!t.ok){if(t.status>=500)throw new S(e,t.status);if(t.status===402)throw new M;try{let a=yield t.json(),o=a.code;if(o!=null&&this.errors[o]!=null)throw this.errors[o](a);if(a.message!=null)throw new S(a.message,t.status)}catch(a){if(a instanceof c)throw a;console.error("Error parsing response",a)}throw new S(yield t.text(),t.status)}})}};var B=class B extends R{constructor(t){super("BaseCrossmintService");let e=se(t);if(!e.isValid)throw new Error("API key invalid");this.crossmintAPIHeaders={accept:"application/json","content-type":"application/json","x-api-key":t},this.crossmintBaseUrl=this.getUrlFromEnv(e.environment),this.apiErrorService=new q}fetchCrossmintAPI(o){return i(this,arguments,function*(t,e={method:"GET"},n,a){return I("FETCH_CROSSMINT_API",()=>i(this,null,function*(){let s=`${this.crossmintBaseUrl}/${t}`,{body:l,method:u}=e,p;try{p=yield fetch(s,{body:l,method:u,headers:d(d({},this.crossmintAPIHeaders),a!=null&&{Authorization:`Bearer ${a}`})})}catch(m){throw new S(`Error fetching Crossmint API: ${m}`)}return p.ok||(yield this.apiErrorService.throwErrorFromResponse({response:p,onServerErrorMessage:n})),yield p.json()}),{endpoint:t})})}getUrlFromEnv(t){let e=B.urlMap[t];if(!e)throw console.log(" CrossmintService.urlMap: ",B.urlMap),new Error(`URL not found for environment: ${t}`);return e}};B.urlMap={development:It,staging:Ct,production:_t};var X=B;var Z=class extends X{idempotentCreateSmartWallet(t,e){return i(this,null,function*(){return this.fetchCrossmintAPI(`${ct}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(e)},"Error creating abstract wallet. Please contact support",t.jwt)})}getSmartWalletConfig(t,e){return i(this,null,function*(){return this.fetchCrossmintAPI(`${ct}/sdk/smart-wallet/config?chain=${e}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",t.jwt)})}fetchNFTs(t,e){return i(this,null,function*(){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${e}:${t}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${t}`)})}getPasskeyServerUrl(){return this.crossmintBaseUrl+"/internal/passkeys"}};function Q(r){return!1}import{stringify as Vt}from"viem";var ie=["sendTransaction","writeContract","sendUserOperation"],le=["signMessage","signTypedData"];function dt(r){return ie.includes(r)}function ce(r){return le.includes(r)}var tt=class{constructor(t){this.errorProcessor=t}decorate({crossmintChain:t,smartAccountClient:e}){return new Proxy(e,{get:(n,a,o)=>{let s=Reflect.get(n,a,o);return typeof s!="function"||typeof a!="string"||!(ce(a)||dt(a))?s:(...l)=>I(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,s,l,t))}})}execute(t,e,n,a,o){return i(this,null,function*(){try{z(`[CrossmintSmartWallet.${e}] - params: ${Vt(a)}`);let s=dt(e)?this.processTxnArgs(e,o,a):a;return yield n.call(t,...s)}catch(s){let l=dt(e)?"signing":"sending transaction";throw this.errorProcessor.map(s,new c(`Error ${l}: ${s.message}`,Vt(s)))}})}processTxnArgs(t,e,n){if(t==="sendUserOperation"){let[{userOperation:o,middleware:s,account:l}]=n;return[{middleware:s,account:l,userOperation:this.addGelatoBundlerProperties(e,o)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(e,a),...n.slice(1)]}addGelatoBundlerProperties(t,e){return Q(t)?E(d({},e),{maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}):e}};function et(r){return{pubKeyX:r.pubKeyX,pubKeyY:r.pubKeyY,passkeyName:r.passkeyName,type:"passkeys"}}import{createKernelAccountClient as xe}from"@zerodev/sdk";import{ENTRYPOINT_ADDRESS_V06 as ke,ENTRYPOINT_ADDRESS_V07 as Ne}from"permissionless";import{createPublicClient as Ve,getAddress as Me,http as Jt}from"viem";import{blockchainToChainId as Le}from"@crossmint/common-sdk-base";var ut=["0.3.1","0.3.0","0.2.4"];function Mt(r){return ut.includes(r)}var yt=["v0.6","v0.7"];function Lt(r){return yt.includes(r)}import{base as pe,baseSepolia as me,polygon as de,polygonAmoy as ue}from"viem/chains";import{BlockchainIncludingTestnet as rt,objectValues as ft}from"@crossmint/common-sdk-base";var Ut={BASE_SEPOLIA:rt.BASE_SEPOLIA,POLYGON_AMOY:rt.POLYGON_AMOY},en=ft(Ut),Kt={BASE:rt.BASE,POLYGON:rt.POLYGON},rn=ft(Kt),ye=d(d({},Ut),Kt),nn=ft(ye),Et={polygon:"5c9f4865-ca8e-44bb-9b9e-3810b2b46f9f","polygon-amoy":"3deef404-ca06-4a5d-9a58-907c99e7ef00","base-sepolia":"5a127978-6473-4784-9dfb-f74395b220a6",base:"e8b3020f-4dde-4176-8a7d-be8102527a5c"},nt={polygon:de,"polygon-amoy":ue,base:pe,"base-sepolia":me},St=r=>Wt+Et[r];import{providerToSmartAccountSigner as fe}from"permissionless";var $t=Dt(t=>i(void 0,[t],function*({walletParams:r}){if(Ee(r.signer))return yield fe(r.signer);if(Se(r.signer))return r.signer.account;{let e=r.signer;throw new c(`The signer type ${e.type} is not supported`)}}),"createOwnerSigner");function Ee(r){return r&&typeof r.request=="function"}function Se(r){return r&&r.type==="VIEM_ACCOUNT"}import{signerToEcdsaValidator as ge}from"@zerodev/ecdsa-validator";import{createKernelAccount as Pe}from"@zerodev/sdk";var at=class{get(u,p){return i(this,arguments,function*({chain:t,publicClient:e,entryPoint:n,walletParams:a,kernelVersion:o,user:s},l){let m=yield $t({chain:t,walletParams:a});if(l!=null&&!H(m.address,l.eoaAddress))throw new h(`User '${s.id}' has an existing wallet with an eoa signer '${l.eoaAddress}', this does not match input eoa signer '${m.address}'.`,l,{type:"eoa",eoaAddress:l.eoaAddress});let f=yield ge(e,{signer:m,entryPoint:n.address,kernelVersion:o});return{account:yield Pe(e,{plugins:{sudo:f},index:BigInt(0),entryPoint:n.address,kernelVersion:o}),signerData:{eoaAddress:m.address,type:"eoa"}}})}};import{PasskeyValidatorContractVersion as he,WebAuthnMode as Re,toPasskeyValidator as Te}from"@zerodev/passkey-validator";import{createKernelAccount as Ae}from"@zerodev/sdk";import{toWebAuthnKey as we}from"@zerodev/webauthn-key";function Bt(r){return r.walletParams.signer.type==="PASSKEY"}var ot=class{constructor(t){this.crossmintService=t}get(l,u){return i(this,arguments,function*({user:t,publicClient:e,walletParams:n,entryPoint:a,kernelVersion:o},s){var m;let p=(m=n.signer.passkeyName)!=null?m:t.id;if(s!=null&&s.passkeyName!==p)throw new W(`User '${t.id}' has an existing wallet created with a passkey named '${s.passkeyName}', this does match input passkey name '${p}'.`,et(s));try{let f=yield this.getPasskey(t,p,s),Y=he.V0_0_2,F=s==null?Y:s.validatorContractVersion,ht=yield Te(e,{webAuthnKey:f,entryPoint:a.address,validatorContractVersion:F,kernelVersion:o}),Gt=yield Ae(e,{plugins:{sudo:ht},entryPoint:a.address,kernelVersion:o});return{signerData:this.getSignerData(ht,F,p),account:this.decorate(Gt,p)}}catch(f){throw this.mapError(f,p)}})}getPasskey(t,e,n){return i(this,null,function*(){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:we({passkeyName:e,passkeyServerUrl:this.crossmintService.getPasskeyServerUrl(),mode:Re.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(t)})})}getSignerData(t,e,n){return E(d({},_e(t.getSerializedData())),{passkeyName:n,validatorContractVersion:e,domain:window.location.hostname,type:"passkeys"})}createPasskeysServerHeaders(t){return{"x-api-key":this.crossmintService.crossmintAPIHeaders["x-api-key"],Authorization:`Bearer ${t.jwt}`}}mapError(t,e){return t.code===0&&t.name==="DataError"?new V(e):t.message==="Registration not verified"?new N(e):t.code==="ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY"&&t.name==="NotAllowedError"?new k(e):t}decorate(t,e){return new Proxy(t,{get:(n,a,o)=>{let s=Reflect.get(n,a,o);return typeof s!="function"||typeof a!="string"||!Ce(a)?s:(...l)=>i(this,null,function*(){try{return yield s.call(n,...l)}catch(u){throw this.mapError(u,e)}})}})}},Ie=["signMessage","signTypedData","signUserOperation","signTransaction"];function Ce(r){return Ie.includes(r)}var _e=r=>{let t=Oe(r),e=new TextDecoder().decode(t);return JSON.parse(e)};function Oe(r){let t=atob(r);return Uint8Array.from(t,e=>e.codePointAt(0))}import{createZeroDevPaymasterClient as We}from"@zerodev/sdk";import{http as be}from"viem";function Yt(r){return!Q(r)}var De=r=>bt+Et[r];function Ft({entryPoint:r,chain:t}){return{middleware:{sponsorUserOperation:n=>i(this,[n],function*({userOperation:e}){return We({chain:nt[t],transport:be(De(t)),entryPoint:r}).sponsorUserOperation({userOperation:e,entryPoint:r})})}}}var st=class{constructor(t,e,n=new gt(new at,new ot(t))){this.crossmintWalletService=t;this.clientDecorator=e;this.accountFactory=n}getOrCreate(t,e,n){return i(this,null,function*(){let{entryPoint:a,kernelVersion:o,existingSignerConfig:s,smartContractWalletAddress:l,userId:u}=yield this.fetchConfig(t,e),p=Ve({transport:Jt(St(e))}),{account:m,signerData:f}=yield this.accountFactory.get({chain:e,walletParams:n,publicClient:p,user:E(d({},t),{id:u}),entryPoint:a,kernelVersion:o},s);if(l!=null&&!H(l,m.address))throw new w(u);s==null&&(yield this.crossmintWalletService.idempotentCreateSmartWallet(t,{type:At,smartContractWalletAddress:m.address,signerData:f,version:0,baseLayer:"evm",chainId:Le(e),entryPointVersion:a.version,kernelVersion:o}));let Y=xe(d({account:m,chain:nt[e],entryPoint:m.entryPoint,bundlerTransport:Jt(St(e))},Yt(e)&&Ft({entryPoint:m.entryPoint,chain:e}))),F=this.clientDecorator.decorate({crossmintChain:e,smartAccountClient:Y});return new $(this.crossmintWalletService,F,p,e)})}fetchConfig(t,e){return i(this,null,function*(){let{entryPointVersion:n,kernelVersion:a,signers:o,smartContractWalletAddress:s,userId:l}=yield this.crossmintWalletService.getSmartWalletConfig(t,e);if(!Mt(a))throw new c(`Unsupported kernel version. Supported versions: ${ut.join(", ")}. Version used: ${a}, Please contact support`);if(!Lt(n))throw new c(`Unsupported entry point version. Supported versions: ${yt.join(", ")}. Version used: ${n}. Please contact support`);if(n==="v0.7"&&a.startsWith("0.2")||n==="v0.6"&&a.startsWith("0.3"))throw new c(`Unsupported combination: entryPoint ${n} and kernel version ${a}. Please contact support`);return{entryPoint:{version:n,address:n==="v0.6"?ke:Ne},kernelVersion:a,userId:l,existingSignerConfig:this.getSigner(o),smartContractWalletAddress:s!=null?Me(s):void 0}})}getSigner(t){if(t.length!==0){if(t.length>1)throw new S("Invalid wallet signer configuration. Please contact support");return t[0].signerData}}},gt=class{constructor(t,e){this.eoa=t;this.passkey=e}get(t,e){if(Bt(t)){if(e!=null&&(e==null?void 0:e.type)!=="passkeys")throw new h(`Cannot create wallet with passkey signer for user '${t.user.id}', they have an existing wallet with eoa signer '${e.eoaAddress}.'`,e);return this.passkey.get(t,e)}if(e!=null&&(e==null?void 0:e.type)!=="eoa")throw new h(`Cannot create wallet with eoa signer for user '${t.user.id}', they already have a wallet with a passkey named '${e.passkeyName}' as it's signer.`,et(e));return this.eoa.get(t,e)}};import{BaseError as Ue,stringify as Ke}from"viem";var it=class{constructor(t){this.logger=t}map(t,e){return this.record(t),t instanceof c||t instanceof Ue?t:e}record(t){let e=t instanceof Error?t.message:String(t);this.logger.logError(`Smart Wallet SDK Error: ${e}`,{stack:t instanceof Error?t.stack:void 0,name:t instanceof Error?t.name:"UnknownError",details:Ke(t),domain:window.location.hostname,sdk_version:Ot})}};var Pt=class r extends R{constructor(e,n){super("SmartWalletSDK");this.smartWalletService=e;this.errorProcessor=n}static init({clientApiKey:e}){if(!J())throw new c("Smart Wallet SDK should only be used client side.");if(!Be(e).isValid)throw new Error("API key invalid");let a=new Z(e),o=new it(new C);return new r(new st(a,new tt(o)),o)}getOrCreateWallet(o,s){return i(this,arguments,function*(e,n,a={signer:{type:"PASSKEY"}}){return I("GET_OR_CREATE_WALLET",()=>i(this,null,function*(){try{return yield this.smartWalletService.getOrCreate(e,n,a)}catch(l){throw this.errorProcessor.map(l,new c(`Wallet creation failed: ${l.message}.`,$e(l)))}}),{user:e,chain:n})})}};export{U as AdminAlreadyUsedError,h as AdminMismatchError,ga as Chain,L as ConfigError,S as CrossmintServiceError,$ as EVMSmartWallet,v as JWTDecryptionError,b as JWTExpiredError,x as JWTIdentifierError,D as JWTInvalidError,K as NonCustodialWalletsNotEnabledError,A as NotAuthorizedError,M as OutOfCreditsError,V as PasskeyIncompatibleAuthenticatorError,W as PasskeyMismatchError,k as PasskeyPromptError,N as PasskeyRegistrationError,Pt as SmartWalletSDK,c as SmartWalletSDKError,O as TransferError,w as UserWalletAlreadyCreatedError,Sa as blockchainToChainId};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|