@zerodev/wallet-core 0.0.1-alpha.3 → 0.0.1-alpha.5

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 (59) hide show
  1. package/dist/_cjs/actions/auth/loginWithStamp.js +11 -2
  2. package/dist/_cjs/actions/auth/loginWithStamp.js.map +1 -1
  3. package/dist/_cjs/actions/wallet/getUserWallet.js +6 -1
  4. package/dist/_cjs/actions/wallet/getUserWallet.js.map +1 -1
  5. package/dist/_cjs/adapters/viem.js +4 -3
  6. package/dist/_cjs/adapters/viem.js.map +1 -1
  7. package/dist/_cjs/client/createClient.js +8 -4
  8. package/dist/_cjs/client/createClient.js.map +1 -1
  9. package/dist/_cjs/client/transports/createTransport.js +5 -3
  10. package/dist/_cjs/client/transports/createTransport.js.map +1 -1
  11. package/dist/_cjs/client/transports/rest.js +21 -5
  12. package/dist/_cjs/client/transports/rest.js.map +1 -1
  13. package/dist/_cjs/core/createZeroDevWallet.js +27 -66
  14. package/dist/_cjs/core/createZeroDevWallet.js.map +1 -1
  15. package/dist/_cjs/utils/exportWallet.js +6 -6
  16. package/dist/_cjs/utils/exportWallet.js.map +1 -1
  17. package/dist/_esm/actions/auth/loginWithStamp.js +11 -2
  18. package/dist/_esm/actions/auth/loginWithStamp.js.map +1 -1
  19. package/dist/_esm/actions/wallet/getUserWallet.js +7 -2
  20. package/dist/_esm/actions/wallet/getUserWallet.js.map +1 -1
  21. package/dist/_esm/adapters/viem.js +4 -3
  22. package/dist/_esm/adapters/viem.js.map +1 -1
  23. package/dist/_esm/client/createClient.js +8 -4
  24. package/dist/_esm/client/createClient.js.map +1 -1
  25. package/dist/_esm/client/transports/createTransport.js +5 -3
  26. package/dist/_esm/client/transports/createTransport.js.map +1 -1
  27. package/dist/_esm/client/transports/rest.js +21 -5
  28. package/dist/_esm/client/transports/rest.js.map +1 -1
  29. package/dist/_esm/core/createZeroDevWallet.js +27 -68
  30. package/dist/_esm/core/createZeroDevWallet.js.map +1 -1
  31. package/dist/_esm/utils/exportWallet.js +6 -6
  32. package/dist/_esm/utils/exportWallet.js.map +1 -1
  33. package/dist/_types/actions/auth/loginWithStamp.d.ts +2 -0
  34. package/dist/_types/actions/auth/loginWithStamp.d.ts.map +1 -1
  35. package/dist/_types/actions/wallet/getUserWallet.d.ts +4 -2
  36. package/dist/_types/actions/wallet/getUserWallet.d.ts.map +1 -1
  37. package/dist/_types/adapters/viem.d.ts +1 -0
  38. package/dist/_types/adapters/viem.d.ts.map +1 -1
  39. package/dist/_types/client/createClient.d.ts +3 -4
  40. package/dist/_types/client/createClient.d.ts.map +1 -1
  41. package/dist/_types/client/transports/createTransport.d.ts.map +1 -1
  42. package/dist/_types/client/transports/rest.d.ts +6 -3
  43. package/dist/_types/client/transports/rest.d.ts.map +1 -1
  44. package/dist/_types/client/types.d.ts +11 -12
  45. package/dist/_types/client/types.d.ts.map +1 -1
  46. package/dist/_types/core/createZeroDevWallet.d.ts +1 -1
  47. package/dist/_types/core/createZeroDevWallet.d.ts.map +1 -1
  48. package/dist/_types/utils/exportWallet.d.ts.map +1 -1
  49. package/dist/tsconfig.build.tsbuildinfo +1 -1
  50. package/package.json +3 -3
  51. package/src/actions/auth/loginWithStamp.ts +12 -2
  52. package/src/actions/wallet/getUserWallet.ts +10 -3
  53. package/src/adapters/viem.ts +5 -3
  54. package/src/client/createClient.ts +13 -18
  55. package/src/client/transports/createTransport.ts +5 -3
  56. package/src/client/transports/rest.ts +24 -11
  57. package/src/client/types.ts +13 -15
  58. package/src/core/createZeroDevWallet.ts +28 -76
  59. package/src/utils/exportWallet.ts +12 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerodev/wallet-core",
3
- "version": "0.0.1-alpha.3",
3
+ "version": "0.0.1-alpha.5",
4
4
  "description": "ZeroDev Wallet SDK built on Turnkey",
5
5
  "main": "./dist/_cjs/index.js",
6
6
  "module": "./dist/_esm/index.js",
@@ -55,11 +55,11 @@
55
55
  "@turnkey/webauthn-stamper": "^0.6.0"
56
56
  },
57
57
  "peerDependencies": {
58
- "viem": "2.37.6"
58
+ "viem": "^2.38.0"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/node": "^20.0.0",
62
- "typescript": "~5.9.0"
62
+ "typescript": "5.9.3"
63
63
  },
64
64
  "scripts": {
65
65
  "build": "pnpm run clean && pnpm run build:cjs && pnpm run build:esm && pnpm run build:types",
@@ -1,4 +1,5 @@
1
1
  import type { Client } from '../../client/types.js'
2
+ import type { Stamp } from '../../stampers/types.js'
2
3
 
3
4
  export type EmailCustomization = {
4
5
  /** A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. */
@@ -12,6 +13,8 @@ export type LoginWithStampParameters = {
12
13
  organizationId: string
13
14
  /** The encoded public key for the request */
14
15
  targetPublicKey: string
16
+ /** The stamper type for the request */
17
+ stampWith?: 'indexedDb' | 'webauthn'
15
18
  }
16
19
 
17
20
  export type LoginWithStampReturnType = {
@@ -39,7 +42,7 @@ export async function loginWithStamp(
39
42
  client: Client,
40
43
  params: LoginWithStampParameters,
41
44
  ): Promise<LoginWithStampReturnType> {
42
- const { projectId, targetPublicKey, organizationId } = params
45
+ const { projectId, targetPublicKey, organizationId, stampWith } = params
43
46
 
44
47
  const timestampMs = Date.now()
45
48
  const timestampMsString = timestampMs.toString()
@@ -53,7 +56,14 @@ export async function loginWithStamp(
53
56
  timestampMs: timestampMsString,
54
57
  type: 'ACTIVITY_TYPE_STAMP_LOGIN',
55
58
  })}\n`
56
- const stamp = await client.stamper.stamp(stampPayload)
59
+ let stamp: Stamp
60
+ if (stampWith === 'indexedDb') {
61
+ stamp = await client.indexedDbStamper.stamp(stampPayload)
62
+ } else if (stampWith === 'webauthn') {
63
+ stamp = await client.webauthnStamper.stamp(stampPayload)
64
+ } else {
65
+ stamp = await client.indexedDbStamper.stamp(stampPayload)
66
+ }
57
67
 
58
68
  return client.request({
59
69
  path: `${projectId}/auth/login/passkey`,
@@ -6,11 +6,13 @@ export type GetUserWalletParameters = {
6
6
  organizationId: string
7
7
  /** The project ID for the request */
8
8
  projectId: string
9
+ /** The token for the request */
10
+ token: string
9
11
  }
10
12
 
11
13
  export type GetUserWalletReturnType = {
12
14
  /** The wallet address */
13
- walletAddress: Hex
15
+ walletAddresses: Hex[]
14
16
  /** The user ID */
15
17
  userId?: string
16
18
  }
@@ -28,19 +30,24 @@ export type GetUserWalletReturnType = {
28
30
  * organizationId: 'org_123',
29
31
  * projectId: 'proj_456'
30
32
  * });
31
- * console.log(wallet.walletAddress); // '0x...'
33
+ * console.log(wallet.walletAddresses); // ['0x...', '0x...']
32
34
  * ```
33
35
  */
34
36
  export async function getUserWallet(
35
37
  client: Client,
36
38
  params: GetUserWalletParameters,
37
39
  ): Promise<GetUserWalletReturnType> {
38
- const { organizationId, projectId } = params
40
+ const { organizationId, projectId, token } = params
39
41
 
40
42
  return await client.request({
41
43
  path: `${projectId}/user-wallet`,
42
44
  body: {
43
45
  organizationId,
44
46
  },
47
+ headers: {
48
+ Authorization: `Bearer ${token}`,
49
+ },
50
+ stamp: true,
51
+ stampPostion: 'headers',
45
52
  })
46
53
  }
@@ -24,12 +24,13 @@ export interface ToViemAccountParams {
24
24
  client: ZeroDevWalletClient
25
25
  organizationId: string
26
26
  projectId: string
27
+ token: string
27
28
  }
28
29
 
29
30
  export async function toViemAccount(
30
31
  params: ToViemAccountParams,
31
32
  ): Promise<LocalAccount> {
32
- const { client, organizationId, projectId } = params
33
+ const { client, organizationId, projectId, token } = params
33
34
 
34
35
  let address: Hex = zeroAddress
35
36
 
@@ -37,8 +38,9 @@ export async function toViemAccount(
37
38
  const walletResponse = await client.getUserWallet({
38
39
  organizationId,
39
40
  projectId,
41
+ token,
40
42
  })
41
- address = walletResponse.walletAddress
43
+ address = walletResponse.walletAddresses[0]
42
44
  } catch {
43
45
  address = zeroAddress
44
46
  }
@@ -71,7 +73,7 @@ export async function toViemAccount(
71
73
  ? { ...transaction, sidecars: false }
72
74
  : transaction
73
75
 
74
- const serializedTx = serializer(signableTransaction)
76
+ const serializedTx = await serializer(signableTransaction)
75
77
  const nonHexPrefixedSerializedTx = serializedTx.replace(/^0x/, '')
76
78
  const signature = await client.signTransaction({
77
79
  organizationId,
@@ -1,4 +1,3 @@
1
- import type { Stamper } from '../stampers/types.js'
2
1
  import {
3
2
  type ZeroDevWalletActions,
4
3
  zeroDevWalletActions,
@@ -14,11 +13,11 @@ let clientId = 0
14
13
  */
15
14
  export function createBaseClient<
16
15
  extended extends Record<string, unknown> | undefined = undefined,
17
- TStamper extends Stamper = Stamper,
18
- >(config: ClientConfig): Client<extended, TStamper> {
16
+ >(config: ClientConfig): Client<extended> {
19
17
  const {
20
18
  transport,
21
- stamper,
19
+ indexedDbStamper,
20
+ webauthnStamper,
22
21
  organizationId,
23
22
  key = 'zeroDevWallet',
24
23
  name = 'ZeroDev Wallet Client',
@@ -30,7 +29,8 @@ export function createBaseClient<
30
29
  request,
31
30
  value,
32
31
  } = transport({
33
- stamper,
32
+ indexedDbStamper,
33
+ webauthnStamper,
34
34
  })
35
35
  const transportInstance = { ...transportConfig, ...value }
36
36
 
@@ -39,7 +39,8 @@ export function createBaseClient<
39
39
  const client = {
40
40
  transport: transportInstance,
41
41
  request,
42
- stamper,
42
+ indexedDbStamper,
43
+ webauthnStamper,
43
44
  organizationId,
44
45
  key,
45
46
  name,
@@ -65,16 +66,12 @@ export function createBaseClient<
65
66
  }
66
67
  }
67
68
 
68
- return Object.assign(client, { extend: extend(client) as any }) as Client<
69
- extended,
70
- TStamper
71
- >
69
+ return Object.assign(client, {
70
+ extend: extend(client) as any,
71
+ }) as Client<extended>
72
72
  }
73
73
 
74
- export type ZeroDevWalletClient<TStamper extends Stamper = Stamper> = Client<
75
- ZeroDevWalletActions,
76
- TStamper
77
- >
74
+ export type ZeroDevWalletClient = Client<ZeroDevWalletActions>
78
75
 
79
76
  /**
80
77
  * Creates a ZeroDev Wallet client with ZeroDev Wallet actions pre-loaded.
@@ -82,14 +79,12 @@ export type ZeroDevWalletClient<TStamper extends Stamper = Stamper> = Client<
82
79
  *
83
80
  * For a client without pre-loaded actions, use createBaseClient().
84
81
  */
85
- export function createClient<TStamper extends Stamper = Stamper>(
86
- config: ClientConfig<TStamper>,
87
- ): ZeroDevWalletClient<TStamper> {
82
+ export function createClient(config: ClientConfig): ZeroDevWalletClient {
88
83
  const { key = 'zeroDevWallet', name = 'ZeroDev Wallet Client' } = config
89
84
  const client = createBaseClient({
90
85
  ...config,
91
86
  key,
92
87
  name,
93
88
  })
94
- return client.extend(zeroDevWalletActions) as ZeroDevWalletClient<TStamper>
89
+ return client.extend(zeroDevWalletActions) as ZeroDevWalletClient
95
90
  }
@@ -26,13 +26,14 @@ export function zeroDevWalletTransport(
26
26
  name = 'ZeroDev Wallet Transport',
27
27
  } = options
28
28
 
29
- return ({ stamper }) => {
29
+ return ({ indexedDbStamper, webauthnStamper }) => {
30
30
  // Create REST transport with stamper
31
31
  const transport = rest(baseUrl, {
32
32
  timeoutMs,
33
33
  key,
34
34
  name,
35
- stamper,
35
+ indexedDbStamper,
36
+ webauthnStamper,
36
37
  })
37
38
 
38
39
  return {
@@ -45,7 +46,8 @@ export function zeroDevWalletTransport(
45
46
  },
46
47
  request: transport.request,
47
48
  value: {
48
- stamper,
49
+ indexedDbStamper,
50
+ webauthnStamper,
49
51
  },
50
52
  }
51
53
  }
@@ -1,12 +1,14 @@
1
1
  import { RestRequestError, RestTimeoutError } from '../../errors/request.js'
2
- import type { Stamper } from '../../stampers/types.js'
2
+ import type { IndexedDbStamper, WebauthnStamper } from '../../stampers/types.js'
3
3
 
4
4
  export type RestRequestArgs = {
5
5
  path: string
6
6
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE'
7
7
  body?: any
8
8
  headers?: Record<string, string>
9
- stamp?: boolean // When true, will stamp the request body
9
+ stamp?: boolean
10
+ stampWith?: 'indexedDb' | 'webAuthn'
11
+ stampPostion?: 'body' | 'headers'
10
12
  }
11
13
 
12
14
  export type RestRequestFn = <T = any>(args: RestRequestArgs) => Promise<T>
@@ -27,13 +29,11 @@ export type RestTransportConfig = {
27
29
  timeoutMs?: number
28
30
  key?: string
29
31
  name?: string
30
- stamper?: Stamper
32
+ indexedDbStamper: IndexedDbStamper
33
+ webauthnStamper: WebauthnStamper
31
34
  }
32
35
 
33
- export function rest(
34
- url: string,
35
- cfg: RestTransportConfig = {},
36
- ): RestTransport {
36
+ export function rest(url: string, cfg: RestTransportConfig): RestTransport {
37
37
  const timeoutMs = cfg.timeoutMs ?? 10_000
38
38
  const key = cfg.key ?? 'rest'
39
39
  const name = cfg.name ?? 'HTTP REST'
@@ -45,20 +45,33 @@ export function rest(
45
45
 
46
46
  try {
47
47
  let requestBody = args.body
48
- const requestHeaders = {
48
+ let requestHeaders = {
49
49
  'content-type': 'application/json',
50
50
  ...(args.headers ?? {}),
51
51
  ...(cfg.fetchOptions?.headers ?? {}),
52
52
  }
53
53
 
54
54
  // Handle stamping if requested
55
- if (args.stamp && cfg.stamper) {
55
+ if (args.stamp) {
56
+ let stamper: IndexedDbStamper | WebauthnStamper
57
+ if (args.stampWith === 'indexedDb') {
58
+ stamper = cfg.indexedDbStamper
59
+ } else if (args.stampWith === 'webAuthn') {
60
+ stamper = cfg.webauthnStamper
61
+ } else {
62
+ stamper = cfg.indexedDbStamper
63
+ }
56
64
  const { body, apiUrl } = args.body
57
65
  const bodyString = `${JSON.stringify(body ?? args.body)}\n`
58
- const stamp = await cfg.stamper.stamp(bodyString)
66
+ const stamp = await stamper.stamp(bodyString)
59
67
 
60
68
  // Restructure request body to match backend expectation
61
- if (body) {
69
+ if (args.stampPostion === 'headers') {
70
+ requestHeaders = {
71
+ ...requestHeaders,
72
+ [stamp.stampHeaderName]: stamp.stampHeaderValue,
73
+ }
74
+ } else if (body) {
62
75
  requestBody = {
63
76
  body: bodyString,
64
77
  stamp: {
@@ -1,4 +1,4 @@
1
- import type { Stamper } from '../stampers/types.js'
1
+ import type { IndexedDbStamper, WebauthnStamper } from '../stampers/types.js'
2
2
  import type { RestRequestFn } from './transports/rest.js'
3
3
 
4
4
  export type TransportConfig = {
@@ -16,35 +16,33 @@ export type TransportConfig = {
16
16
  type: string
17
17
  }
18
18
 
19
- export type Transport = (options: { stamper: Stamper }) => {
19
+ export type Transport = (options: {
20
+ indexedDbStamper: IndexedDbStamper
21
+ webauthnStamper: WebauthnStamper
22
+ }) => {
20
23
  config: TransportConfig
21
24
  request: RestRequestFn
22
25
  value?: Record<string, unknown>
23
26
  }
24
27
 
25
- export type ClientConfig<TStamper extends Stamper = Stamper> = {
26
- /** Transport for the client */
28
+ export type ClientConfig = {
27
29
  transport: Transport
28
- /** Stamper for authenticated requests */
29
- stamper: TStamper
30
- /** Organization ID */
30
+ indexedDbStamper: IndexedDbStamper
31
+ webauthnStamper: WebauthnStamper
31
32
  organizationId?: string
32
- /** A key for the client. */
33
33
  key?: string
34
- /** A name for the client. */
35
34
  name?: string
36
35
  }
37
36
 
38
- export type Client<
39
- extended extends Extended | undefined = undefined,
40
- TStamper extends Stamper = Stamper,
41
- > = {
37
+ export type Client<extended extends Extended | undefined = undefined> = {
42
38
  /** Transport configuration */
43
39
  transport: TransportConfig & Record<string, unknown>
44
40
  /** Request function from transport */
45
41
  request: RestRequestFn
46
- /** Stamper for authenticated requests */
47
- stamper: TStamper
42
+ /** IndexedDB Stamper for authenticated requests */
43
+ indexedDbStamper: IndexedDbStamper
44
+ /** WebAuthn Stamper for authenticated requests */
45
+ webauthnStamper: WebauthnStamper
48
46
  /** Organization ID */
49
47
  organizationId?: string
50
48
  /** A key for the client */
@@ -13,7 +13,6 @@ import {
13
13
  KMS_SERVER_URL,
14
14
  } from '../constants.js'
15
15
  import { createIndexedDbStamper } from '../stampers/indexedDbStamper.js'
16
- import type { IndexedDbStamper } from '../stampers/types.js'
17
16
  import { createWebauthnStamper } from '../stampers/webauthnStamper.js'
18
17
  import { createWebStorageAdapter } from '../storage/adapters.js'
19
18
  import {
@@ -73,7 +72,7 @@ export type AuthParams =
73
72
  }
74
73
 
75
74
  export interface ZeroDevWalletSDK {
76
- client: () => ZeroDevWalletClient | null
75
+ client: ZeroDevWalletClient
77
76
  auth: (params: AuthParams) => Promise<any>
78
77
 
79
78
  getPublicKey: () => Promise<string | null>
@@ -112,42 +111,19 @@ export async function createZeroDevWallet(
112
111
 
113
112
  const webauthnStamper = await createWebauthnStamper({ rpId })
114
113
 
115
- let currentClient: ZeroDevWalletClient | null = null
116
-
117
- const indexedDbClient = createClient({
118
- stamper: indexedDbStamper,
119
- transport: zeroDevWalletTransport({
120
- baseUrl: config.proxyBaseUrl || `${KMS_SERVER_URL}/api/v1`,
121
- }),
122
- })
123
-
124
- const passkeyClient = createClient({
125
- stamper: webauthnStamper,
114
+ const client = createClient({
115
+ indexedDbStamper,
116
+ webauthnStamper,
126
117
  transport: zeroDevWalletTransport({
127
118
  baseUrl: config.proxyBaseUrl || `${KMS_SERVER_URL}/api/v1`,
128
119
  }),
129
120
  })
130
121
 
131
- // Restore active session on initialization
132
- const activeSession = await sessionStorageManager.getActiveSession()
133
-
134
- if (activeSession) {
135
- try {
136
- if (activeSession.stamperType === 'indexedDb') {
137
- currentClient = indexedDbClient
138
- }
139
- } catch (_error) {}
140
- }
141
-
142
- const getClient = () => {
143
- return currentClient
144
- }
145
-
146
122
  return {
147
- client: getClient,
123
+ client,
148
124
  async getPublicKey() {
149
- await indexedDbClient.stamper.resetKeyPair()
150
- const compressedPublicKey = await indexedDbClient.stamper.getPublicKey()
125
+ await client.indexedDbStamper.resetKeyPair()
126
+ const compressedPublicKey = await client.indexedDbStamper.getPublicKey()
151
127
  return compressedPublicKey
152
128
  },
153
129
 
@@ -168,23 +144,6 @@ export async function createZeroDevWallet(
168
144
  await sessionStorageManager.setActiveSession(sessionId)
169
145
  const session = await sessionStorageManager.getActiveSession()
170
146
 
171
- if (session) {
172
- // Update current client based on session's stamper type
173
- let stamper: IndexedDbStamper | undefined
174
- if (session.stamperType === 'indexedDb') {
175
- stamper = indexedDbStamper
176
- }
177
-
178
- if (stamper) {
179
- currentClient = createClient({
180
- stamper,
181
- transport: zeroDevWalletTransport({
182
- baseUrl: config.proxyBaseUrl || `${KMS_SERVER_URL}/api/v1`,
183
- }),
184
- })
185
- }
186
- }
187
-
188
147
  return session
189
148
  },
190
149
 
@@ -194,7 +153,6 @@ export async function createZeroDevWallet(
194
153
 
195
154
  async clearAllSessions() {
196
155
  await sessionStorageManager.clearAllSessions()
197
- currentClient = null
198
156
  },
199
157
 
200
158
  async refreshSession(sessionId?: string) {
@@ -215,12 +173,13 @@ export async function createZeroDevWallet(
215
173
  )
216
174
  const compressedPublicKeyHex =
217
175
  await generateCompressedPublicKeyFromKeyPair(newKeyPair)
218
- const data = await indexedDbClient.loginWithStamp({
176
+ const data = await client.loginWithStamp({
219
177
  targetPublicKey: compressedPublicKeyHex,
220
178
  projectId,
221
179
  organizationId: activeSession.organizationId,
180
+ stampWith: 'indexedDb',
222
181
  })
223
- await indexedDbClient.stamper.resetKeyPair(newKeyPair)
182
+ await client.indexedDbStamper.resetKeyPair(newKeyPair)
224
183
  const parsedSession = parseSession(data.session)
225
184
  const session: ZeroDevWalletSession = {
226
185
  id: `session_indexedDb_${Date.now()}`,
@@ -234,7 +193,6 @@ export async function createZeroDevWallet(
234
193
  }
235
194
  await sessionStorageManager.clearSession(activeSession.id)
236
195
  await sessionStorageManager.storeSession(session, session.id)
237
- currentClient = indexedDbClient
238
196
  return session
239
197
  }
240
198
  throw new Error('Invalid session type')
@@ -245,13 +203,13 @@ export async function createZeroDevWallet(
245
203
  switch (params.type) {
246
204
  case 'oauth': {
247
205
  const { credential } = params
248
- const targetPublicKey = await indexedDbClient.stamper.getPublicKey()
206
+ const targetPublicKey = await client.indexedDbStamper.getPublicKey()
249
207
 
250
208
  if (!targetPublicKey) {
251
209
  throw new Error('Failed to get public key')
252
210
  }
253
211
 
254
- const data = await indexedDbClient.authenticateWithOAuth({
212
+ const data = await client.authenticateWithOAuth({
255
213
  oidcToken: credential,
256
214
  provider: 'google',
257
215
  targetPublicKey,
@@ -274,7 +232,6 @@ export async function createZeroDevWallet(
274
232
  }
275
233
  await sessionStorageManager.storeSession(session, session.id)
276
234
  }
277
- currentClient = indexedDbClient
278
235
  return data
279
236
  }
280
237
  case 'passkey': {
@@ -285,8 +242,8 @@ export async function createZeroDevWallet(
285
242
  params.mode === 'register'
286
243
  ) {
287
244
  const { email } = params
288
- await indexedDbClient.stamper.resetKeyPair()
289
- const tempPublicKey = await indexedDbClient.stamper.getPublicKey()
245
+ await client.indexedDbStamper.resetKeyPair()
246
+ const tempPublicKey = await client.indexedDbStamper.getPublicKey()
290
247
  if (!tempPublicKey) {
291
248
  throw new Error('Failed to get public key')
292
249
  }
@@ -315,7 +272,7 @@ export async function createZeroDevWallet(
315
272
  },
316
273
  },
317
274
  })
318
- const data = await passkeyClient.registerWithPasskey({
275
+ const data = await client.registerWithPasskey({
319
276
  email,
320
277
  attestation,
321
278
  challenge: encodedChallenge,
@@ -332,12 +289,12 @@ export async function createZeroDevWallet(
332
289
  )
333
290
  const compressedPublicKeyHex =
334
291
  await generateCompressedPublicKeyFromKeyPair(newKeyPair)
335
- const loginData = await indexedDbClient.loginWithStamp({
292
+ const loginData = await client.loginWithStamp({
336
293
  projectId,
337
294
  targetPublicKey: compressedPublicKeyHex,
338
295
  organizationId: data.subOrganizationId,
339
296
  })
340
- await indexedDbClient.stamper.resetKeyPair(newKeyPair)
297
+ await client.indexedDbStamper.resetKeyPair(newKeyPair)
341
298
  const parsedSession = parseSession(loginData.session)
342
299
  const session: ZeroDevWalletSession = {
343
300
  id: `session_indexedDb_${Date.now()}`,
@@ -352,7 +309,6 @@ export async function createZeroDevWallet(
352
309
  token: loginData.session,
353
310
  }
354
311
  await sessionStorageManager.storeSession(session, session.id)
355
- currentClient = indexedDbClient
356
312
  return data
357
313
  }
358
314
  if (
@@ -360,16 +316,17 @@ export async function createZeroDevWallet(
360
316
  'mode' in params &&
361
317
  params.mode === 'login'
362
318
  ) {
363
- await indexedDbClient.stamper.resetKeyPair()
319
+ await client.indexedDbStamper.resetKeyPair()
364
320
  const generatedPublicKey =
365
- await indexedDbClient.stamper.getPublicKey()
321
+ await client.indexedDbStamper.getPublicKey()
366
322
  if (!generatedPublicKey) {
367
323
  throw new Error('Failed to get public key')
368
324
  }
369
- const loginData = await passkeyClient.loginWithStamp({
325
+ const loginData = await client.loginWithStamp({
370
326
  targetPublicKey: generatedPublicKey,
371
327
  projectId,
372
328
  organizationId,
329
+ stampWith: 'webauthn',
373
330
  })
374
331
  const parsedSession = parseSession(loginData.session)
375
332
  const session: ZeroDevWalletSession = {
@@ -385,7 +342,6 @@ export async function createZeroDevWallet(
385
342
  token: loginData.session,
386
343
  }
387
344
  await sessionStorageManager.storeSession(session, session.id)
388
- currentClient = indexedDbClient
389
345
  return loginData
390
346
  }
391
347
  throw new Error('Passkey authentication requires passkey parameter')
@@ -396,7 +352,7 @@ export async function createZeroDevWallet(
396
352
  if (type === 'otp' && mode === 'sendOtp') {
397
353
  const { email, contact, emailCustomization } = params
398
354
 
399
- const data = await indexedDbClient.registerWithOTP({
355
+ const data = await client.registerWithOTP({
400
356
  email,
401
357
  contact,
402
358
  projectId,
@@ -408,14 +364,14 @@ export async function createZeroDevWallet(
408
364
 
409
365
  if (type === 'otp' && mode === 'verifyOtp') {
410
366
  const { otpId, otpCode, subOrganizationId } = params
411
- await indexedDbClient.stamper.resetKeyPair()
412
- const targetPublicKey = await indexedDbClient.stamper.getPublicKey()
367
+ await client.indexedDbStamper.resetKeyPair()
368
+ const targetPublicKey = await client.indexedDbStamper.getPublicKey()
413
369
 
414
370
  if (!targetPublicKey) {
415
371
  throw new Error('Failed to get public key')
416
372
  }
417
373
 
418
- const data = await indexedDbClient.loginWithOTP({
374
+ const data = await client.loginWithOTP({
419
375
  otpId,
420
376
  otpCode,
421
377
  subOrganizationId,
@@ -440,7 +396,6 @@ export async function createZeroDevWallet(
440
396
  }
441
397
  await sessionStorageManager.storeSession(session, session.id)
442
398
  }
443
- currentClient = indexedDbClient
444
399
  return data
445
400
  }
446
401
 
@@ -453,8 +408,7 @@ export async function createZeroDevWallet(
453
408
 
454
409
  async logout() {
455
410
  await sessionStorageManager.clearAllSessions()
456
- currentClient = null
457
- await indexedDbClient.stamper.resetKeyPair()
411
+ await client.indexedDbStamper.resetKeyPair()
458
412
  return true
459
413
  },
460
414
 
@@ -463,14 +417,12 @@ export async function createZeroDevWallet(
463
417
  if (!session) {
464
418
  throw new Error('No active session')
465
419
  }
466
- if (!currentClient) {
467
- throw new Error('No client')
468
- }
469
420
 
470
421
  return toViemAccount({
471
- client: currentClient,
422
+ client,
472
423
  organizationId: session.organizationId,
473
424
  projectId,
425
+ token: session.token ?? '',
474
426
  })
475
427
  },
476
428
  }
@@ -54,9 +54,12 @@ export async function exportWallet(
54
54
  organizationId,
55
55
  })
56
56
 
57
- const listWalletsStamp = await wallet
58
- .client()
59
- ?.stamper.stamp(listWalletsBody)
57
+ const listWalletsStamp =
58
+ await wallet.client[
59
+ session.stamperType === 'indexedDb'
60
+ ? 'indexedDbStamper'
61
+ : 'webauthnStamper'
62
+ ].stamp(listWalletsBody)
60
63
  if (!listWalletsStamp) {
61
64
  throw new Error('Failed to stamp list wallets body')
62
65
  }
@@ -88,9 +91,12 @@ export async function exportWallet(
88
91
  language: 'MNEMONIC_LANGUAGE_ENGLISH',
89
92
  },
90
93
  })
91
- const exportWalletStamp = await wallet
92
- .client()
93
- ?.stamper.stamp(exportWalletBody)
94
+ const exportWalletStamp =
95
+ await wallet.client[
96
+ session.stamperType === 'indexedDb'
97
+ ? 'indexedDbStamper'
98
+ : 'webauthnStamper'
99
+ ].stamp(exportWalletBody)
94
100
  if (!exportWalletStamp) {
95
101
  throw new Error('Failed to stamp export wallet body')
96
102
  }