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

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.
Files changed (42) hide show
  1. package/dist/index.cjs +4 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +254 -119
  4. package/dist/index.d.ts +254 -119
  5. package/dist/index.js +4 -1
  6. package/dist/index.js.map +1 -1
  7. package/package.json +4 -12
  8. package/src/SmartWalletSDK.test.ts +12 -13
  9. package/src/SmartWalletSDK.ts +33 -26
  10. package/src/api/APIErrorService.ts +10 -7
  11. package/src/api/BaseCrossmintService.ts +3 -4
  12. package/src/api/CrossmintWalletService.test.ts +9 -9
  13. package/src/api/CrossmintWalletService.ts +39 -16
  14. package/src/blockchain/chains.ts +25 -2
  15. package/src/blockchain/transfer.ts +1 -1
  16. package/src/blockchain/wallets/EVMSmartWallet.ts +49 -42
  17. package/src/blockchain/wallets/account/config.ts +60 -0
  18. package/src/blockchain/wallets/account/creator.ts +36 -0
  19. package/src/blockchain/wallets/account/eoa.ts +50 -0
  20. package/src/blockchain/wallets/{passkey.ts → account/passkey.ts} +32 -32
  21. package/src/blockchain/wallets/account/signer.ts +44 -0
  22. package/src/blockchain/wallets/account/strategy.ts +5 -0
  23. package/src/blockchain/wallets/clientDecorator.ts +6 -6
  24. package/src/blockchain/wallets/paymaster.ts +12 -15
  25. package/src/blockchain/wallets/service.ts +38 -143
  26. package/src/error/index.ts +25 -117
  27. package/src/error/processor.ts +5 -6
  28. package/src/index.ts +16 -12
  29. package/src/services/logging/ConsoleProvider.ts +3 -12
  30. package/src/services/logging/DatadogProvider.ts +1 -1
  31. package/src/types/internal.ts +41 -20
  32. package/src/types/{Config.ts → params.ts} +0 -5
  33. package/src/types/schema.ts +63 -0
  34. package/src/types/service.ts +31 -0
  35. package/src/utils/api.ts +39 -0
  36. package/src/utils/constants.ts +2 -0
  37. package/src/utils/log.ts +1 -109
  38. package/src/utils/signer.ts +14 -16
  39. package/src/blockchain/wallets/eoa.ts +0 -49
  40. package/src/types/API.ts +0 -40
  41. package/src/utils/log.test.ts +0 -76
  42. /package/src/types/{Tokens.ts → token.ts} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,19 +1,29 @@
1
1
  import { ObjectValues } from '@crossmint/common-sdk-base';
2
2
  export { EVMBlockchainIncludingTestnet as Chain, blockchainToChainId } from '@crossmint/common-sdk-base';
3
- import { LocalAccount, EIP1193Provider, HttpTransport, Chain, Hex, PublicClient } from 'viem';
4
- import { PasskeyValidatorContractVersion } from '@zerodev/passkey-validator';
5
- import { SmartAccountClient } from 'permissionless';
3
+ import { LocalAccount, EIP1193Provider, HttpTransport, Chain, PublicClient } from 'viem';
4
+ import { SmartAccountClient, UserOperation } from 'permissionless';
5
+ import { EntryPoint, GetEntryPointVersion } from 'permissionless/types/entrypoint';
6
+ import { CrossmintSDKError, SmartWalletErrorCode } from '@crossmint/client-sdk-base';
7
+ export { CrossmintSDKError, CrossmintServiceError, JWTDecryptionError, JWTExpiredError, JWTIdentifierError, JWTInvalidError, NotAuthorizedError, SmartWalletErrorCode, TransferError } from '@crossmint/client-sdk-base';
8
+ import { z } from 'zod';
6
9
  import { SmartAccount } from 'permissionless/accounts';
7
- import { EntryPoint } from 'permissionless/types/entrypoint';
10
+ import { PasskeyValidatorContractVersion } from '@zerodev/passkey-validator';
8
11
 
9
12
  declare const SmartWalletChain: {
10
13
  readonly BASE: "base";
11
14
  readonly POLYGON: "polygon";
15
+ readonly OPTIMISM: "optimism";
16
+ readonly ARBITRUM: "arbitrum";
12
17
  readonly BASE_SEPOLIA: "base-sepolia";
13
18
  readonly POLYGON_AMOY: "polygon-amoy";
19
+ readonly OPTIMISM_SEPOLIA: "optimism-sepolia";
20
+ readonly ARBITRUM_SEPOLIA: "arbitrum-sepolia";
14
21
  };
15
22
  type SmartWalletChain = ObjectValues<typeof SmartWalletChain>;
16
23
 
24
+ declare const SUPPORTED_KERNEL_VERSIONS: readonly ["0.3.1", "0.3.0", "0.2.4"];
25
+ declare const SUPPORTED_ENTRYPOINT_VERSIONS: readonly ["v0.6", "v0.7"];
26
+
17
27
  type SmartWalletSDKInitParams = {
18
28
  clientApiKey: string;
19
29
  };
@@ -40,21 +50,231 @@ interface WalletParams {
40
50
  signer: EOASigner | PasskeySigner;
41
51
  }
42
52
 
43
- declare const SUPPORTED_KERNEL_VERSIONS: readonly ["0.3.1", "0.3.0", "0.2.4"];
44
53
  type SupportedKernelVersion = (typeof SUPPORTED_KERNEL_VERSIONS)[number];
45
- declare const SUPPORTED_ENTRYPOINT_VERSIONS: readonly ["v0.6", "v0.7"];
46
54
  type SupportedEntryPointVersion = (typeof SUPPORTED_ENTRYPOINT_VERSIONS)[number];
47
- type PasskeyValidatorSerializedData = {
48
- passkeyServerUrl: string;
49
- entryPoint: Hex;
50
- validatorAddress: Hex;
55
+ type SmartWalletClient = SmartAccountClient<EntryPoint, HttpTransport, Chain, SmartAccount<EntryPoint>>;
56
+
57
+ declare const EOASignerDataSchema: z.ZodObject<{
58
+ eoaAddress: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
59
+ type: z.ZodLiteral<"eoa">;
60
+ }, "strip", z.ZodTypeAny, {
61
+ type: "eoa";
62
+ eoaAddress: `0x${string}`;
63
+ }, {
64
+ type: "eoa";
65
+ eoaAddress: `0x${string}`;
66
+ }>;
67
+ declare const PasskeySignerDataSchema: z.ZodObject<{
68
+ entryPoint: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
69
+ validatorAddress: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
70
+ pubKeyX: z.ZodString;
71
+ pubKeyY: z.ZodString;
72
+ authenticatorIdHash: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
73
+ authenticatorId: z.ZodString;
74
+ passkeyName: z.ZodString;
75
+ validatorContractVersion: z.ZodNativeEnum<typeof PasskeyValidatorContractVersion>;
76
+ domain: z.ZodString;
77
+ type: z.ZodLiteral<"passkeys">;
78
+ }, "strip", z.ZodTypeAny, {
79
+ type: "passkeys";
80
+ entryPoint: `0x${string}`;
81
+ domain: string;
82
+ validatorAddress: `0x${string}`;
51
83
  pubKeyX: string;
52
84
  pubKeyY: string;
53
- authenticatorIdHash: Hex;
85
+ authenticatorIdHash: `0x${string}`;
54
86
  authenticatorId: string;
55
- };
56
- type SmartWalletClient = SmartAccountClient<EntryPoint, HttpTransport, Chain, SmartAccount<EntryPoint>>;
87
+ passkeyName: string;
88
+ validatorContractVersion: PasskeyValidatorContractVersion;
89
+ }, {
90
+ type: "passkeys";
91
+ entryPoint: `0x${string}`;
92
+ domain: string;
93
+ validatorAddress: `0x${string}`;
94
+ pubKeyX: string;
95
+ pubKeyY: string;
96
+ authenticatorIdHash: `0x${string}`;
97
+ authenticatorId: string;
98
+ passkeyName: string;
99
+ validatorContractVersion: PasskeyValidatorContractVersion;
100
+ }>;
101
+ declare const SignerDataSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
102
+ entryPoint: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
103
+ validatorAddress: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
104
+ pubKeyX: z.ZodString;
105
+ pubKeyY: z.ZodString;
106
+ authenticatorIdHash: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
107
+ authenticatorId: z.ZodString;
108
+ passkeyName: z.ZodString;
109
+ validatorContractVersion: z.ZodNativeEnum<typeof PasskeyValidatorContractVersion>;
110
+ domain: z.ZodString;
111
+ type: z.ZodLiteral<"passkeys">;
112
+ }, "strip", z.ZodTypeAny, {
113
+ type: "passkeys";
114
+ entryPoint: `0x${string}`;
115
+ domain: string;
116
+ validatorAddress: `0x${string}`;
117
+ pubKeyX: string;
118
+ pubKeyY: string;
119
+ authenticatorIdHash: `0x${string}`;
120
+ authenticatorId: string;
121
+ passkeyName: string;
122
+ validatorContractVersion: PasskeyValidatorContractVersion;
123
+ }, {
124
+ type: "passkeys";
125
+ entryPoint: `0x${string}`;
126
+ domain: string;
127
+ validatorAddress: `0x${string}`;
128
+ pubKeyX: string;
129
+ pubKeyY: string;
130
+ authenticatorIdHash: `0x${string}`;
131
+ authenticatorId: string;
132
+ passkeyName: string;
133
+ validatorContractVersion: PasskeyValidatorContractVersion;
134
+ }>, z.ZodObject<{
135
+ eoaAddress: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
136
+ type: z.ZodLiteral<"eoa">;
137
+ }, "strip", z.ZodTypeAny, {
138
+ type: "eoa";
139
+ eoaAddress: `0x${string}`;
140
+ }, {
141
+ type: "eoa";
142
+ eoaAddress: `0x${string}`;
143
+ }>]>;
144
+ declare const SmartWalletConfigSchema: z.ZodObject<{
145
+ kernelVersion: z.ZodEnum<["0.3.1", "0.3.0", "0.2.4"]>;
146
+ entryPointVersion: z.ZodEnum<["v0.6", "v0.7"]>;
147
+ userId: z.ZodString;
148
+ signers: z.ZodArray<z.ZodObject<{
149
+ signerData: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
150
+ entryPoint: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
151
+ validatorAddress: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
152
+ pubKeyX: z.ZodString;
153
+ pubKeyY: z.ZodString;
154
+ authenticatorIdHash: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
155
+ authenticatorId: z.ZodString;
156
+ passkeyName: z.ZodString;
157
+ validatorContractVersion: z.ZodNativeEnum<typeof PasskeyValidatorContractVersion>;
158
+ domain: z.ZodString;
159
+ type: z.ZodLiteral<"passkeys">;
160
+ }, "strip", z.ZodTypeAny, {
161
+ type: "passkeys";
162
+ entryPoint: `0x${string}`;
163
+ domain: string;
164
+ validatorAddress: `0x${string}`;
165
+ pubKeyX: string;
166
+ pubKeyY: string;
167
+ authenticatorIdHash: `0x${string}`;
168
+ authenticatorId: string;
169
+ passkeyName: string;
170
+ validatorContractVersion: PasskeyValidatorContractVersion;
171
+ }, {
172
+ type: "passkeys";
173
+ entryPoint: `0x${string}`;
174
+ domain: string;
175
+ validatorAddress: `0x${string}`;
176
+ pubKeyX: string;
177
+ pubKeyY: string;
178
+ authenticatorIdHash: `0x${string}`;
179
+ authenticatorId: string;
180
+ passkeyName: string;
181
+ validatorContractVersion: PasskeyValidatorContractVersion;
182
+ }>, z.ZodObject<{
183
+ eoaAddress: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
184
+ type: z.ZodLiteral<"eoa">;
185
+ }, "strip", z.ZodTypeAny, {
186
+ type: "eoa";
187
+ eoaAddress: `0x${string}`;
188
+ }, {
189
+ type: "eoa";
190
+ eoaAddress: `0x${string}`;
191
+ }>]>;
192
+ }, "strip", z.ZodTypeAny, {
193
+ signerData: {
194
+ type: "eoa";
195
+ eoaAddress: `0x${string}`;
196
+ } | {
197
+ type: "passkeys";
198
+ entryPoint: `0x${string}`;
199
+ domain: string;
200
+ validatorAddress: `0x${string}`;
201
+ pubKeyX: string;
202
+ pubKeyY: string;
203
+ authenticatorIdHash: `0x${string}`;
204
+ authenticatorId: string;
205
+ passkeyName: string;
206
+ validatorContractVersion: PasskeyValidatorContractVersion;
207
+ };
208
+ }, {
209
+ signerData: {
210
+ type: "eoa";
211
+ eoaAddress: `0x${string}`;
212
+ } | {
213
+ type: "passkeys";
214
+ entryPoint: `0x${string}`;
215
+ domain: string;
216
+ validatorAddress: `0x${string}`;
217
+ pubKeyX: string;
218
+ pubKeyY: string;
219
+ authenticatorIdHash: `0x${string}`;
220
+ authenticatorId: string;
221
+ passkeyName: string;
222
+ validatorContractVersion: PasskeyValidatorContractVersion;
223
+ };
224
+ }>, "many">;
225
+ smartContractWalletAddress: z.ZodOptional<z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>>;
226
+ }, "strip", z.ZodTypeAny, {
227
+ kernelVersion: "0.3.1" | "0.3.0" | "0.2.4";
228
+ entryPointVersion: "v0.6" | "v0.7";
229
+ userId: string;
230
+ signers: {
231
+ signerData: {
232
+ type: "eoa";
233
+ eoaAddress: `0x${string}`;
234
+ } | {
235
+ type: "passkeys";
236
+ entryPoint: `0x${string}`;
237
+ domain: string;
238
+ validatorAddress: `0x${string}`;
239
+ pubKeyX: string;
240
+ pubKeyY: string;
241
+ authenticatorIdHash: `0x${string}`;
242
+ authenticatorId: string;
243
+ passkeyName: string;
244
+ validatorContractVersion: PasskeyValidatorContractVersion;
245
+ };
246
+ }[];
247
+ smartContractWalletAddress?: `0x${string}` | undefined;
248
+ }, {
249
+ kernelVersion: "0.3.1" | "0.3.0" | "0.2.4";
250
+ entryPointVersion: "v0.6" | "v0.7";
251
+ userId: string;
252
+ signers: {
253
+ signerData: {
254
+ type: "eoa";
255
+ eoaAddress: `0x${string}`;
256
+ } | {
257
+ type: "passkeys";
258
+ entryPoint: `0x${string}`;
259
+ domain: string;
260
+ validatorAddress: `0x${string}`;
261
+ pubKeyX: string;
262
+ pubKeyY: string;
263
+ authenticatorIdHash: `0x${string}`;
264
+ authenticatorId: string;
265
+ passkeyName: string;
266
+ validatorContractVersion: PasskeyValidatorContractVersion;
267
+ };
268
+ }[];
269
+ smartContractWalletAddress?: `0x${string}` | undefined;
270
+ }>;
57
271
 
272
+ type EOASignerData = z.infer<typeof EOASignerDataSchema>;
273
+ type PasskeySignerData = z.infer<typeof PasskeySignerDataSchema>;
274
+ type SmartWalletConfig = z.infer<typeof SmartWalletConfigSchema>;
275
+ type SignerData = z.infer<typeof SignerDataSchema>;
276
+ type PasskeyDisplay = Pick<PasskeySignerData, "type" | "passkeyName" | "pubKeyX" | "pubKeyY">;
277
+ type SignerDisplay = EOASignerData | PasskeyDisplay;
58
278
  type StoreSmartWalletParams = {
59
279
  type: string;
60
280
  smartContractWalletAddress: string;
@@ -66,139 +286,59 @@ type StoreSmartWalletParams = {
66
286
  entryPointVersion: SupportedEntryPointVersion;
67
287
  kernelVersion: SupportedKernelVersion;
68
288
  };
69
- type SignerData = EOASignerData | PasskeySignerData;
70
- interface EOASignerData {
71
- eoaAddress: string;
72
- type: "eoa";
73
- }
74
- type PasskeySignerData = PasskeyValidatorSerializedData & {
75
- passkeyName: string;
76
- validatorContractVersion: PasskeyValidatorContractVersion;
77
- domain: string;
78
- type: "passkeys";
79
- };
80
- type PasskeyDisplay = Pick<PasskeySignerData, "type" | "passkeyName" | "pubKeyX" | "pubKeyY">;
81
- type SignerDisplay = EOASignerData | PasskeyDisplay;
82
289
 
83
- declare class LoggerWrapper {
84
- private extraInfo;
85
- private logIdempotencyKey;
86
- constructor(className: string, extraInfo?: {}, logIdempotencyKey?: string);
87
- private logInput;
88
- private logOutput;
89
- private logError;
90
- protected logPerformance<T>(name: string, cb: () => Promise<T>): Promise<T>;
91
- }
92
-
93
- declare const SmartWalletErrors: {
94
- readonly NOT_AUTHORIZED: "smart-wallet:not-authorized";
95
- readonly TRANSFER: "smart-wallet:transfer.error";
96
- readonly CROSSMINT_SERVICE: "smart-wallet:crossmint-service.error";
97
- readonly ERROR_JWT_EXPIRED: "smart-wallet:not-authorized.jwt-expired";
98
- readonly ERROR_JWT_INVALID: "smart-wallet:not-authorized.jwt-invalid";
99
- readonly ERROR_JWT_DECRYPTION: "smart-wallet:not-authorized.jwt-decryption";
100
- readonly ERROR_JWT_IDENTIFIER: "smart-wallet:not-authorized.jwt-identifier";
101
- readonly ERROR_USER_WALLET_ALREADY_CREATED: "smart-wallet:user-wallet-already-created.error";
102
- readonly ERROR_OUT_OF_CREDITS: "smart-wallet:out-of-credits.error";
103
- readonly ERROR_WALLET_CONFIG: "smart-wallet:wallet-config.error";
104
- readonly ERROR_ADMIN_MISMATCH: "smart-wallet:wallet-config.admin-mismatch";
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";
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";
111
- readonly UNCATEGORIZED: "smart-wallet:uncategorized";
112
- };
113
- type SmartWalletErrorCode = (typeof SmartWalletErrors)[keyof typeof SmartWalletErrors];
114
- declare class SmartWalletSDKError extends Error {
115
- readonly code: SmartWalletErrorCode;
116
- readonly details?: string;
290
+ declare class SmartWalletError extends CrossmintSDKError {
117
291
  constructor(message: string, details?: string, code?: SmartWalletErrorCode);
118
292
  }
119
- declare class TransferError extends SmartWalletSDKError {
120
- constructor(message: string);
121
- }
122
- declare class CrossmintServiceError extends SmartWalletSDKError {
123
- status?: number;
124
- constructor(message: string, status?: number);
125
- }
126
- declare class AdminMismatchError extends SmartWalletSDKError {
293
+ declare class AdminMismatchError extends SmartWalletError {
127
294
  readonly required: SignerDisplay;
128
295
  readonly used?: SignerDisplay;
129
296
  constructor(message: string, required: SignerDisplay, used?: SignerDisplay);
130
297
  }
131
- declare class PasskeyMismatchError extends SmartWalletSDKError {
298
+ declare class PasskeyMismatchError extends SmartWalletError {
132
299
  readonly required: PasskeyDisplay;
133
300
  readonly used?: PasskeyDisplay;
134
301
  constructor(message: string, required: PasskeyDisplay, used?: PasskeyDisplay);
135
302
  }
136
- declare class NotAuthorizedError extends SmartWalletSDKError {
137
- constructor(message: string);
138
- }
139
- declare class JWTExpiredError extends NotAuthorizedError {
140
- readonly code: "smart-wallet:not-authorized.jwt-expired";
141
- /**
142
- * The expiry time of the JWT as an ISO 8601 timestamp.
143
- */
144
- readonly expiredAt: string;
145
- constructor(expiredAt: Date);
146
- }
147
- declare class JWTInvalidError extends NotAuthorizedError {
148
- readonly code: "smart-wallet:not-authorized.jwt-invalid";
149
- constructor();
150
- }
151
- declare class JWTDecryptionError extends NotAuthorizedError {
152
- readonly code: "smart-wallet:not-authorized.jwt-decryption";
153
- constructor();
154
- }
155
- declare class JWTIdentifierError extends NotAuthorizedError {
156
- readonly code: "smart-wallet:not-authorized.jwt-identifier";
157
- readonly identifierKey: string;
158
- constructor(identifierKey: string);
159
- }
160
- declare class UserWalletAlreadyCreatedError extends SmartWalletSDKError {
161
- readonly code: "smart-wallet:user-wallet-already-created.error";
303
+ declare class UserWalletAlreadyCreatedError extends SmartWalletError {
304
+ readonly code: "smart-wallet:user-wallet-already-created";
162
305
  constructor(userId: string);
163
306
  }
164
- declare class PasskeyPromptError extends SmartWalletSDKError {
307
+ declare class PasskeyPromptError extends SmartWalletError {
165
308
  passkeyName: string;
166
309
  constructor(passkeyName: string);
167
310
  }
168
- declare class PasskeyRegistrationError extends SmartWalletSDKError {
311
+ declare class PasskeyRegistrationError extends SmartWalletError {
169
312
  passkeyName: string;
170
313
  constructor(passkeyName: string);
171
314
  }
172
- declare class PasskeyIncompatibleAuthenticatorError extends SmartWalletSDKError {
315
+ declare class PasskeyIncompatibleAuthenticatorError extends SmartWalletError {
173
316
  passkeyName: string;
174
317
  constructor(passkeyName: string);
175
318
  }
176
- declare class OutOfCreditsError extends SmartWalletSDKError {
177
- constructor(message?: string);
178
- }
179
- declare class ConfigError extends SmartWalletSDKError {
319
+ declare class ConfigError extends SmartWalletError {
180
320
  constructor(message: string);
181
321
  }
182
322
  declare class AdminAlreadyUsedError extends ConfigError {
183
- readonly code: "smart-wallet:wallet-config.admin-signer-already-used";
323
+ readonly code: "smart-wallet:config.admin-signer-already-used";
184
324
  constructor();
185
325
  }
186
- declare class NonCustodialWalletsNotEnabledError extends ConfigError {
187
- readonly code: "smart-wallet:wallet-config.non-custodial-wallets-not-enabled";
326
+ declare class SmartWalletsNotEnabledError extends ConfigError {
327
+ readonly code: "smart-wallet:not-enabled";
188
328
  constructor();
189
329
  }
190
330
 
191
331
  type CrossmintAPIErrorCodes = "ERROR_JWT_INVALID" | "ERROR_JWT_DECRYPTION" | "ERROR_JWT_IDENTIFIER" | "ERROR_JWT_EXPIRED" | "ERROR_USER_WALLET_ALREADY_CREATED" | "ERROR_ADMIN_SIGNER_ALREADY_USED" | "ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED";
192
332
  declare class APIErrorService {
193
333
  private errors;
194
- constructor(errors?: Partial<Record<CrossmintAPIErrorCodes, (apiResponse: any) => SmartWalletSDKError>>);
334
+ constructor(errors?: Record<CrossmintAPIErrorCodes, (apiResponse: any) => SmartWalletError>);
195
335
  throwErrorFromResponse({ response, onServerErrorMessage, }: {
196
336
  response: Response;
197
337
  onServerErrorMessage: string;
198
338
  }): Promise<void>;
199
339
  }
200
340
 
201
- declare abstract class BaseCrossmintService extends LoggerWrapper {
341
+ declare abstract class BaseCrossmintService {
202
342
  crossmintAPIHeaders: Record<string, string>;
203
343
  protected crossmintBaseUrl: string;
204
344
  protected apiErrorService: APIErrorService;
@@ -212,16 +352,11 @@ declare abstract class BaseCrossmintService extends LoggerWrapper {
212
352
  }
213
353
 
214
354
  declare class CrossmintWalletService extends BaseCrossmintService {
215
- idempotentCreateSmartWallet(user: UserParams, input: StoreSmartWalletParams): Promise<any>;
216
- getSmartWalletConfig(user: UserParams, chain: SmartWalletChain): Promise<{
217
- kernelVersion: string;
218
- entryPointVersion: string;
219
- userId: string;
220
- signers: {
221
- signerData: SignerData;
222
- }[];
223
- smartContractWalletAddress?: string;
355
+ idempotentCreateSmartWallet(user: UserParams, input: StoreSmartWalletParams): Promise<void>;
356
+ sponsorUserOperation<E extends EntryPoint>(user: UserParams, userOp: UserOperation<GetEntryPointVersion<E>>, entryPoint: E, chain: SmartWalletChain): Promise<{
357
+ sponsorUserOpParams: UserOperation<GetEntryPointVersion<E>>;
224
358
  }>;
359
+ getSmartWalletConfig(user: UserParams, chain: SmartWalletChain): Promise<SmartWalletConfig>;
225
360
  fetchNFTs(address: string, chain: SmartWalletChain): Promise<any>;
226
361
  getPasskeyServerUrl(): string;
227
362
  }
@@ -258,7 +393,7 @@ type TransferType = ERC20TransferType | SFTTransferType | NFTTransferType;
258
393
  * Smart wallet interface for EVM chains enhanced with Crossmint capabilities.
259
394
  * Core functionality is exposed via [viem](https://viem.sh/) clients within the `client` property of the class.
260
395
  */
261
- declare class EVMSmartWallet extends LoggerWrapper {
396
+ declare class EVMSmartWallet {
262
397
  private readonly crossmintService;
263
398
  private readonly accountClient;
264
399
  readonly chain: SmartWalletChain;
@@ -290,7 +425,7 @@ declare class EVMSmartWallet extends LoggerWrapper {
290
425
  nfts(): Promise<any>;
291
426
  }
292
427
 
293
- declare class SmartWalletSDK extends LoggerWrapper {
428
+ declare class SmartWalletSDK {
294
429
  private readonly smartWalletService;
295
430
  private readonly errorProcessor;
296
431
  private constructor();
@@ -311,4 +446,4 @@ declare class SmartWalletSDK extends LoggerWrapper {
311
446
  getOrCreateWallet(user: UserParams, chain: SmartWalletChain, walletParams?: WalletParams): Promise<EVMSmartWallet>;
312
447
  }
313
448
 
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 };
449
+ export { AdminAlreadyUsedError, AdminMismatchError, ConfigError, type EOASigner, type ERC20TransferType, EVMSmartWallet, 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,2 +1,5 @@
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};
1
+ import{blockchainToChainId as ua,EVMBlockchainIncludingTestnet as ya}from"@crossmint/common-sdk-base";import{isAddress as Ee,publicActions as $e}from"viem";import{TransferError as Ke}from"@crossmint/client-sdk-base";function _(){return typeof window<"u"}function ie(){return process.env.NODE_ENV==="test"?!1:window.location.origin.includes("localhost")}function D(r,e){return r?.toLowerCase()===e?.toLowerCase()}var N=class{logInfo(e,t){console.log(e,t)}logError(e,t){console.error(e,t)}logWarn(e,t){console.warn(e,t)}};import{datadogLogs as te}from"@datadog/browser-logs";var le="ZeroDev";var ce="pub035be8a594b35be1887b6ba76c4029ca",pe="http://localhost:3000/api",me="https://staging.crossmint.com/api",de="https://www.crossmint.com/api",g="SCW_SDK",ue="0.1.0",M="2024-06-09",ye="https://rpc.zerodev.app/api/v2/bundler/";var Z=["0.3.1","0.3.0","0.2.4"],Q=["v0.6","v0.7"];var h=class{logInfo(e,t){ee(e,"info",t)}logError(e,t){ee(e,"error",t)}logWarn(e,t){ee(e,"warn",t)}};function ee(r,e,t){let n=t?{...t,service:g}:{service:g};_e(),te.logger[e](r,n)}function _e(){te.getInternalContext()==null&&te.init({clientToken:ce,site:"datadoghq.com",forwardErrorsToLogs:!1,sampleRate:100})}function De(){return _()&&ie()?new N:new h}var{logInfo:C,logWarn:tr,logError:U}=De();async function y(r,e,t){let n=new Date().getTime(),a=await e(),o={durationInMs:new Date().getTime()-n,...t};return C(`[${g} - ${r} - TIME] - ${Ne(o)}`,{args:o}),a}function Ne(r){try{return r!=null?JSON.stringify(r,null,2):r}catch{return Me(r)}}function Me(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 fe(r){let e=r instanceof Error?r:{message:"Unknown error",name:"Unknown error"};if(!(e instanceof Error)&&e.constructor?.name!=="SyntheticBaseEvent")throw U("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 Ve,erc721Abi as Le}from"viem";var ge=[{inputs:[{internalType:"string",name:"uri_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[]",name:"ids",type:"uint256[]"},{indexed:!1,internalType:"uint256[]",name:"values",type:"uint256[]"}],name:"TransferBatch",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"id",type:"uint256"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"TransferSingle",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"string",name:"value",type:"string"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"URI",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"id",type:"uint256"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address[]",name:"accounts",type:"address[]"},{internalType:"uint256[]",name:"ids",type:"uint256[]"}],name:"balanceOfBatch",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256[]",name:"ids",type:"uint256[]"},{internalType:"uint256[]",name:"amounts",type:"uint256[]"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeBatchTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"uri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"}];function Se({contract:r,config:e,from:t,to:n}){switch(e.token.type){case"ft":return{account:t,address:r,abi:Ve,functionName:"transfer",args:[n,e.amount]};case"sft":return{account:t,address:r,abi:ge,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId,e.quantity,"0x00"],tokenId:e.token.tokenId};case"nft":return{account:t,address:r,abi:Le,functionName:"safeTransferFrom",args:[t.address,n,e.token.tokenId],tokenId:e.token.tokenId}}}var w=class{constructor(e,t,n,a){this.crossmintService=e;this.accountClient=t;this.chain=a,this.client={wallet:t,public:n}}get address(){return this.accountClient.account.address}async transferToken(e,t){return y("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(!Ee(e))throw new Error(`Invalid recipient address: '${e}' is not a valid EVM address.`);if(!Ee(t.token.contractAddress))throw new Error(`Invalid contract address: '${t.token.contractAddress}' is not a valid EVM address.`);let n=Se({contract:t.token.contractAddress,to:e,from:this.accountClient.account,config:t});try{let a=this.accountClient.extend($e),{request:s}=await a.simulateContract(n),o=await a.writeContract(s);return C(`[TRANSFER] - Transaction hash from transfer: ${o}`),o}catch(a){U("[TRANSFER] - ERROR_TRANSFERRING_TOKEN",{service:g,error:fe(a),tokenId:n.tokenId,contractAddress:t.token.contractAddress,chain:t.token.chain});let s=n.tokenId==null?"":`:${n.tokenId}}`;throw new Ke(`Error transferring token ${t.token.contractAddress}${s}`)}},{toAddress:e,config:t})}async nfts(){return this.crossmintService.fetchNFTs(this.address,this.chain)}};import{CrossmintSDKError as Be,SmartWalletErrorCode as m}from"@crossmint/client-sdk-base";var l=class extends Be{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}},E=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}},R=class extends l{constructor(e){super(`Prompt was either cancelled or timed out for passkey ${e}`,void 0,m.PASSKEY_PROMPT),this.passkeyName=e}},I=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}},O=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}},P=class extends l{constructor(e){super(e,void 0,m.WALLET_CONFIG)}},v=class extends P{constructor(){super("This signer was already used to create another wallet. Please use a different signer.");this.code=m.ADMIN_SIGNER_ALREADY_USED}},x=class extends P{constructor(){super("Smart wallets are not enabled for this project. They can be enabled on the project settings page in the developer console.");this.code=m.SMART_WALLETS_NOT_ENABLED}};import{SmartWalletErrorCode as Ea,CrossmintSDKError as Pa,CrossmintServiceError as ha,TransferError as Ca,JWTDecryptionError as Ta,JWTExpiredError as Aa,JWTIdentifierError as wa,JWTInvalidError as ba,NotAuthorizedError as Ra}from"@crossmint/client-sdk-base";import{stringify as Bt}from"viem";import{validateAPIKey as Ft}from"@crossmint/common-sdk-base";import{CrossmintServiceError as ot}from"@crossmint/client-sdk-base";import{blockchainToChainId as st}from"@crossmint/common-sdk-base";import{CrossmintServiceError as He}from"@crossmint/client-sdk-base";import{validateAPIKey as ze}from"@crossmint/common-sdk-base";import{CrossmintServiceError as re,JWTDecryptionError as Fe,JWTExpiredError as Ye,JWTIdentifierError as je,JWTInvalidError as Ge,OutOfCreditsError as Je}from"@crossmint/client-sdk-base";var V=class{constructor(e={ERROR_JWT_INVALID:()=>new Ge,ERROR_JWT_DECRYPTION:()=>new Fe,ERROR_JWT_EXPIRED:({expiredAt:t})=>new Ye(new Date(t)),ERROR_JWT_IDENTIFIER:({identifierKey:t})=>new je(t),ERROR_USER_WALLET_ALREADY_CREATED:({userId:t})=>new E(t),ERROR_ADMIN_SIGNER_ALREADY_USED:()=>new v,ERROR_PROJECT_NONCUSTODIAL_WALLETS_NOT_ENABLED:()=>new x}){this.errors=e}async throwErrorFromResponse({response:e,onServerErrorMessage:t}){if(!e.ok){if(e.status>=500)throw new re(t,e.status);if(e.status===402)throw new Je;try{let n=await e.json(),a=n.code;if(a!=null&&this.errors[a]!=null)throw this.errors[a](n);if(n.message!=null)throw new re(n.message,e.status)}catch(n){if(n instanceof l)throw n;console.error("Error parsing response",n)}throw new re(await e.text(),e.status)}}};var W=class W{constructor(e){let t=ze(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 V}async fetchCrossmintAPI(e,t={method:"GET"},n,a){return y("FETCH_CROSSMINT_API",async()=>{let s=`${this.crossmintBaseUrl}/${e}`,{body:o,method:i}=t,c;try{c=await fetch(s,{body:o,method:i,headers:{...this.crossmintAPIHeaders,...a!=null&&{Authorization:`Bearer ${a}`}}})}catch(u){throw new He(`Error fetching Crossmint API: ${u}`)}return c.ok||await this.apiErrorService.throwErrorFromResponse({response:c,onServerErrorMessage:n}),await c.json()},{endpoint:e})}getUrlFromEnv(e){let t=W.urlMap[e];if(!t)throw console.log(" CrossmintService.urlMap: ",W.urlMap),new Error(`URL not found for environment: ${e}`);return t}};W.urlMap={development:pe,staging:me,production:de};var L=W;import{PasskeyValidatorContractVersion as qe}from"@zerodev/passkey-validator";import{isAddress as Xe,isHex as Ze}from"viem";import{z as p}from"zod";var Qe=p.custom(r=>Ze(r),{message:"Invalid hex string"}),$=p.custom(r=>Xe(r),{message:"Invalid evm address"}),et=p.object({eoaAddress:$,type:p.literal("eoa")}),tt=p.object({entryPoint:$,validatorAddress:$,pubKeyX:p.string(),pubKeyY:p.string(),authenticatorIdHash:Qe,authenticatorId:p.string()}),rt=tt.extend({passkeyName:p.string(),validatorContractVersion:p.nativeEnum(qe),domain:p.string(),type:p.literal("passkeys")}),nt=p.discriminatedUnion("type",[rt,et]),Pe=p.object({kernelVersion:p.enum(Z,{errorMap:(r,e)=>({message:`Unsupported kernel version. Supported versions: ${Z.join(", ")}. Version used: ${e.data}. Please contact support`})}),entryPointVersion:p.enum(Q,{errorMap:(r,e)=>({message:`Unsupported entry point version. Supported versions: ${Q.join(", ")}. Version used: ${e.data}. Please contact support`})}),userId:p.string().min(1),signers:p.array(p.object({signerData:nt})).min(0).max(1,"Invalid wallet signer configuration. Please contact support"),smartContractWalletAddress:$.optional()});import{toHex as at}from"viem";function K(r,e){let t=e(r);return t.replace?t.value:Array.isArray(r)?r.map(n=>K(n,e)):r!==null&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([n,a])=>[n,K(a,e)])):t.value}function he(r){return K(r,e=>typeof e=="bigint"?{value:at(e),replace:!0}:{value:e,replace:!1})}function Ce(r){return K(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 B=class extends L{async idempotentCreateSmartWallet(e,t){await this.fetchCrossmintAPI(`${M}/sdk/smart-wallet`,{method:"PUT",body:JSON.stringify(t)},"Error creating abstract wallet. Please contact support",e.jwt)}async sponsorUserOperation(e,t,n,a){let s=st(a),o=await this.fetchCrossmintAPI(`${M}/sdk/paymaster`,{method:"POST",body:JSON.stringify({userOp:he(t),entryPoint:n,chainId:s})},"Error sponsoring user operation. Please contact support",e.jwt);return Ce(o)}async getSmartWalletConfig(e,t){let n=await this.fetchCrossmintAPI(`${M}/sdk/smart-wallet/config?chain=${t}`,{method:"GET"},"Error getting smart wallet version configuration. Please contact support",e.jwt),a=Pe.safeParse(n);if(a.success)return a.data;throw new ot(`Invalid smart wallet config, please contact support. Details below:
2
+ ${a.error.toString()}`)}async fetchNFTs(e,t){return this.fetchCrossmintAPI(`v1-alpha1/wallets/${t}:${e}/nfts`,{method:"GET"},`Error fetching NFTs for wallet: ${e}`)}getPasskeyServerUrl(){return this.crossmintBaseUrl+"/internal/passkeys"}};var T=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}}},A=class{constructor(e){this.type="eoa";this.data=e}display(){return this.data}};var F=class{constructor(e){this.crossmintService=e}async get(e,t){let{entryPointVersion:n,kernelVersion:a,signers:s,smartContractWalletAddress:o,userId:i}=await this.crossmintService.getSmartWalletConfig(e,t);if(n==="v0.7"&&a.startsWith("0.2")||n==="v0.6"&&a.startsWith("0.3"))throw new l(`Unsupported combination: entryPoint ${n} and kernel version ${a}. Please contact support`);return{entryPointVersion:n,kernelVersion:a,userId:i,existingSignerConfig:this.getSigner(s.map(c=>c.signerData)),smartContractWalletAddress:o}}getSigner(e){if(e.length===0)return;let t=e[0];if(t.type==="eoa")return new A(t);if(t.type==="passkeys")return new T(t)}};function Te(r){let e="signer"in r.walletParams&&"type"in r.walletParams.signer&&r.walletParams.signer.type==="PASSKEY",t=r.existingSignerConfig==null||r.existingSignerConfig.type==="passkeys";return e&&t}function Ae(r){let e="signer"in r.walletParams&&("type"in r.walletParams.signer&&r.walletParams.signer.type==="VIEM_ACCOUNT"||"request"in r.walletParams.signer&&typeof r.walletParams.signer.request=="function"),t=r.existingSignerConfig==null||r.existingSignerConfig.type==="eoa";return e&&t}var Y=class{constructor(e,t){this.eoaStrategy=e;this.passkeyStrategy=t}get(e){if(Te(e))return this.passkeyStrategy.create(e);if(Ae(e))return this.eoaStrategy.create(e);if(e.existingSignerConfig==null)throw new P(`Unsupported wallet params:
3
+ ${e.walletParams}`);let t=e.existingSignerConfig.display();throw new S(`Cannot create wallet with ${e.existingSignerConfig.type} signer for user ${e.user.id}', they already have a wallet with signer:
4
+ '${t}'`,t)}};import{signerToEcdsaValidator as pt}from"@zerodev/ecdsa-validator";import{createKernelAccount as mt}from"@zerodev/sdk";import{providerToSmartAccountSigner as it}from"permissionless";async function we({walletParams:r}){if(lt(r.signer))return await it(r.signer);if(ct(r.signer))return r.signer.account;{let e=r.signer;throw new l(`The signer type ${e.type} is not supported`)}}function lt(r){return r&&typeof r.request=="function"}function ct(r){return r&&r.type==="VIEM_ACCOUNT"}var j=class{async create({chain:e,publicClient:t,entryPoint:n,walletParams:a,kernelVersion:s,user:o,existingSignerConfig:i}){let c=await we({chain:e,walletParams:a});if(i!=null&&!D(c.address,i.data.eoaAddress))throw new S(`User '${o.id}' has an existing wallet with an eoa signer '${i.data.eoaAddress}', this does not match input eoa signer '${c.address}'.`,i.display(),{type:"eoa",eoaAddress:i.data.eoaAddress});let u=await pt(t,{signer:c,entryPoint:n.address,kernelVersion:s});return{account:await mt(t,{plugins:{sudo:u},index:0n,entryPoint:n.address,kernelVersion:s}),signerConfig:new A({eoaAddress:c.address,type:"eoa"})}}};import{PasskeyValidatorContractVersion as dt,WebAuthnMode as ut,toPasskeyValidator as yt}from"@zerodev/passkey-validator";import{createKernelAccount as ft}from"@zerodev/sdk";import{toWebAuthnKey as gt}from"@zerodev/webauthn-key";var G=class{constructor(e,t){this.passkeyServerUrl=e;this.apiKey=t}async create({user:e,publicClient:t,walletParams:n,entryPoint:a,kernelVersion:s,existingSignerConfig:o}){let i=n.signer.passkeyName??e.id;if(o!=null&&o.data.passkeyName!==i)throw new b(`User '${e.id}' has an existing wallet created with a passkey named '${o.data.passkeyName}', this does match input passkey name '${i}'.`,o.display());try{let c=await this.getPasskey(e,i,o?.data),u=dt.V0_0_2,d=o==null?u:o.data.validatorContractVersion,k=await yt(t,{webAuthnKey:c,entryPoint:a.address,validatorContractVersion:d,kernelVersion:s}),X=await ft(t,{plugins:{sudo:k},entryPoint:a.address,kernelVersion:s});return{signerConfig:this.getSignerConfig(k,d,i),account:this.decorate(X,i)}}catch(c){throw this.mapError(c,i)}}async getPasskey(e,t,n){return n!=null?{pubX:BigInt(n.pubKeyX),pubY:BigInt(n.pubKeyY),authenticatorId:n.authenticatorId,authenticatorIdHash:n.authenticatorIdHash}:gt({passkeyName:t,passkeyServerUrl:this.passkeyServerUrl,mode:ut.Register,passkeyServerHeaders:this.createPasskeysServerHeaders(e)})}getSignerConfig(e,t,n){return new T({...Pt(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 O(t):e.message==="Registration not verified"?new I(t):e.code==="ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY"&&e.name==="NotAllowedError"?new R(t):e}decorate(e,t){return new Proxy(e,{get:(n,a,s)=>{let o=Reflect.get(n,a,s);return typeof o!="function"||typeof a!="string"||!Et(a)?o:async(...i)=>{try{return await o.call(n,...i)}catch(c){throw this.mapError(c,t)}}}})}},St=["signMessage","signTypedData","signUserOperation","signTransaction"];function Et(r){return St.includes(r)}var Pt=r=>{let e=ht(r),t=new TextDecoder().decode(e);return JSON.parse(t)};function ht(r){let e=atob(r);return Uint8Array.from(e,t=>t.codePointAt(0))}import{stringify as be}from"viem";function J(r){return!1}var Ct=["sendTransaction","writeContract","sendUserOperation"],Tt=["signMessage","signTypedData"];function ne(r){return Ct.includes(r)}function At(r){return Tt.includes(r)}var H=class{constructor(e){this.errorProcessor=e}decorate({crossmintChain:e,smartAccountClient:t}){return new Proxy(t,{get:(n,a,s)=>{let o=Reflect.get(n,a,s);return typeof o!="function"||typeof a!="string"||!(At(a)||ne(a))?o:(...i)=>y(`CrossmintSmartWallet.${a}`,()=>this.execute(n,a,o,i,e))}})}async execute(e,t,n,a,s){try{C(`[CrossmintSmartWallet.${t}] - params: ${be(a)}`);let o=ne(t)?this.processTxnArgs(t,s,a):a;return await n.call(e,...o)}catch(o){let i=ne(t)?"signing":"sending transaction";throw this.errorProcessor.map(o,new l(`Error ${i}: ${o.message}`,be(o)))}}processTxnArgs(e,t,n){if(e==="sendUserOperation"){let[{userOperation:s,middleware:o,account:i}]=n;return[{middleware:o,account:i,userOperation:this.addGelatoBundlerProperties(t,s)},...n.slice(1)]}let[a]=n;return[this.addGelatoBundlerProperties(t,a),...n.slice(1)]}addGelatoBundlerProperties(e,t){return J(e)?{...t,maxFeePerGas:"0x0",maxPriorityFeePerGas:"0x0"}:t}};import{createKernelAccountClient as Nt}from"@zerodev/sdk";import{ENTRYPOINT_ADDRESS_V06 as Mt,ENTRYPOINT_ADDRESS_V07 as Ut}from"permissionless";import{createPublicClient as Vt,http as We}from"viem";import{blockchainToChainId as Lt}from"@crossmint/common-sdk-base";import{arbitrum as wt,arbitrumSepolia as bt,base as Rt,baseSepolia as It,optimism as Ot,optimismSepolia as vt,polygon as xt,polygonAmoy as Wt}from"viem/chains";import{BlockchainIncludingTestnet as f,objectValues as ae}from"@crossmint/common-sdk-base";var Re={BASE_SEPOLIA:f.BASE_SEPOLIA,POLYGON_AMOY:f.POLYGON_AMOY,OPTIMISM_SEPOLIA:f.OPTIMISM_SEPOLIA,ARBITRUM_SEPOLIA:f.ARBITRUM_SEPOLIA},vn=ae(Re),Ie={BASE:f.BASE,POLYGON:f.POLYGON,OPTIMISM:f.OPTIMISM,ARBITRUM:f.ARBITRUM},xn=ae(Ie),kt={...Re,...Ie},Wn=ae(kt),_t={polygon:"5c9f4865-ca8e-44bb-9b9e-3810b2b46f9f","polygon-amoy":"3deef404-ca06-4a5d-9a58-907c99e7ef00","base-sepolia":"5a127978-6473-4784-9dfb-f74395b220a6",base:"e8b3020f-4dde-4176-8a7d-be8102527a5c","optimism-sepolia":"f8dd488e-eaed-467d-a5de-0184c160f3b1",optimism:"505950ab-ee07-4a9c-bd16-320ac71a9350",arbitrum:"a965100f-fedf-4e6b-a207-20f5687fcc4f","arbitrum-sepolia":"76c860ca-af77-4fb1-8eac-07825952f6f4"},Oe={polygon:xt,"polygon-amoy":Wt,base:Rt,"base-sepolia":It,optimism:Ot,"optimism-sepolia":vt,arbitrum:wt,"arbitrum-sepolia":bt},oe=r=>ye+_t[r];function ve(r){return!J(r)}function xe({entryPoint:r,chain:e,walletService:t,user:n}){return{middleware:{sponsorUserOperation:async({userOperation:a})=>{let{sponsorUserOpParams:s}=await t.sponsorUserOperation(n,a,r,e);return s}}}}var z=class{constructor(e,t,n,a){this.crossmintService=e;this.accountConfigFacade=t;this.accountCreator=n;this.clientDecorator=a}async getOrCreate(e,t,n){let{entryPointVersion:a,kernelVersion:s,existingSignerConfig:o,smartContractWalletAddress:i,userId:c}=await this.accountConfigFacade.get(e,t),u=Vt({transport:We(oe(t))}),{account:d,signerConfig:k}=await this.accountCreator.get({chain:t,walletParams:n,publicClient:u,user:{...e,id:c},entryPoint:{version:a,address:a==="v0.6"?Mt:Ut},kernelVersion:s,existingSignerConfig:o});if(i!=null&&!D(i,d.address))throw new E(c);o==null&&await this.crossmintService.idempotentCreateSmartWallet(e,{type:le,smartContractWalletAddress:d.address,signerData:k.data,version:0,baseLayer:"evm",chainId:Lt(t),entryPointVersion:a,kernelVersion:s});let X=Nt({account:d,chain:Oe[t],entryPoint:d.entryPoint,bundlerTransport:We(oe(t)),...ve(t)&&xe({entryPoint:d.entryPoint,chain:t,walletService:this.crossmintService,user:e})}),ke=this.clientDecorator.decorate({crossmintChain:t,smartAccountClient:X});return new w(this.crossmintService,ke,u,t)}};import{BaseError as $t,stringify as Kt}from"viem";var q=class{constructor(e){this.logger=e}map(e,t){return this.record(e),e instanceof l||e instanceof $t?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:Kt(e),domain:window.location.hostname,sdk_version:ue})}};var se=class r{constructor(e,t){this.smartWalletService=e;this.errorProcessor=t}static init({clientApiKey:e}){if(!_())throw new l("Smart Wallet SDK should only be used client side.");if(!Ft(e).isValid)throw new Error("API key invalid");let n=new B(e),a=new q(new h),s=new Y(new j,new G(n.getPasskeyServerUrl(),e)),o=new z(n,new F(n),s,new H(a));return new r(o,a)}async getOrCreateWallet(e,t,n={signer:{type:"PASSKEY"}}){return y("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}.`,Bt(a)))}})}};export{v as AdminAlreadyUsedError,S as AdminMismatchError,ya as Chain,P as ConfigError,Pa as CrossmintSDKError,ha as CrossmintServiceError,w as EVMSmartWallet,Ta as JWTDecryptionError,Aa as JWTExpiredError,wa as JWTIdentifierError,ba as JWTInvalidError,Ra as NotAuthorizedError,O as PasskeyIncompatibleAuthenticatorError,b as PasskeyMismatchError,R as PasskeyPromptError,I as PasskeyRegistrationError,l as SmartWalletError,Ea as SmartWalletErrorCode,se as SmartWalletSDK,x as SmartWalletsNotEnabledError,Ca as TransferError,E as UserWalletAlreadyCreatedError,ua as blockchainToChainId};
2
5
  //# sourceMappingURL=index.js.map