@dynamic-labs/sdk-react-core 2.1.0-alpha.3 → 2.1.0-alpha.4

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/CHANGELOG.md +13 -0
  2. package/package.cjs +1 -1
  3. package/package.js +1 -1
  4. package/package.json +12 -13
  5. package/src/index.cjs +0 -2
  6. package/src/index.d.ts +1 -1
  7. package/src/index.js +0 -1
  8. package/src/lib/locale/en/translation.cjs +2 -2
  9. package/src/lib/locale/en/translation.d.ts +1 -1
  10. package/src/lib/locale/en/translation.js +2 -2
  11. package/src/lib/utils/constants/errors.cjs +0 -2
  12. package/src/lib/utils/constants/errors.js +1 -2
  13. package/src/lib/utils/functions/findTurnkeyWallet/findTurnkeyWallet.cjs +11 -9
  14. package/src/lib/utils/functions/findTurnkeyWallet/findTurnkeyWallet.d.ts +6 -2
  15. package/src/lib/utils/functions/findTurnkeyWallet/findTurnkeyWallet.js +12 -10
  16. package/src/lib/utils/functions/findTurnkeyWallet/index.d.ts +1 -1
  17. package/src/lib/utils/functions/index.d.ts +1 -0
  18. package/src/lib/utils/functions/serializeWalletConnectors/index.d.ts +1 -0
  19. package/src/lib/utils/functions/serializeWalletConnectors/serializeWalletConnectors.cjs +32 -0
  20. package/src/lib/utils/functions/serializeWalletConnectors/serializeWalletConnectors.d.ts +2 -0
  21. package/src/lib/utils/functions/serializeWalletConnectors/serializeWalletConnectors.js +28 -0
  22. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +7 -8
  23. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.d.ts +10 -1
  24. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +7 -8
  25. package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.cjs +1 -1
  26. package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.js +1 -1
  27. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.cjs +137 -25
  28. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.d.ts +17 -7
  29. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.js +140 -28
  30. package/src/lib/utils/hooks/useSendDynamicProps/useSendDynamicProps.cjs +6 -13
  31. package/src/lib/utils/hooks/useSendDynamicProps/useSendDynamicProps.d.ts +1 -3
  32. package/src/lib/utils/hooks/useSendDynamicProps/useSendDynamicProps.js +6 -12
  33. package/src/lib/utils/hooks/useWalletConnectorOptions/useWalletConnectorOptions.cjs +25 -2
  34. package/src/lib/utils/hooks/useWalletConnectorOptions/useWalletConnectorOptions.js +25 -2
  35. package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.cjs +2 -2
  36. package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.js +2 -2
  37. package/src/lib/views/Passkey/utils/createEmbeddedWalletWithPasskey/createEmbeddedWalletWithPasskey.cjs +1 -1
  38. package/src/lib/views/Passkey/utils/createEmbeddedWalletWithPasskey/createEmbeddedWalletWithPasskey.js +1 -1
  39. package/src/lib/views/Passkey/utils/createPregeneratedWallet/createPregeneratedWallet.cjs +1 -1
  40. package/src/lib/views/Passkey/utils/createPregeneratedWallet/createPregeneratedWallet.js +1 -1
  41. package/src/lib/views/Passkey/utils/passkeyRecovery/passkeyRecovery.cjs +7 -7
  42. package/src/lib/views/Passkey/utils/passkeyRecovery/passkeyRecovery.js +7 -7
@@ -5,9 +5,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
6
  var _tslib = require('../../../../../../_virtual/_tslib.cjs');
7
7
  var React = require('react');
8
+ var sdkApiCore = require('@dynamic-labs/sdk-api-core');
8
9
  var utils = require('@dynamic-labs/utils');
9
10
  require('../../../../context/DynamicContext/DynamicContext.cjs');
10
- require('@dynamic-labs/sdk-api-core');
11
11
  var logger = require('../../../../shared/logger.cjs');
12
12
  require('@dynamic-labs/iconic');
13
13
  require('@dynamic-labs/wallet-connector-core');
@@ -34,6 +34,8 @@ var getEOAWallet = require('../../../functions/getEOAWallet/getEOAWallet.cjs');
34
34
  require('../../../../config/ApiEndpoint.cjs');
35
35
  var embeddedWallets = require('../../../../data/api/embeddedWallets/embeddedWallets.cjs');
36
36
  require('../../../../locale/locale.cjs');
37
+ var updateJWTAndCreateUserProfile = require('../../../functions/updateJWTAndCreateUserProfile/updateJWTAndCreateUserProfile.cjs');
38
+ var getUserVerifiedCredentialType = require('../../../functions/getUserVerifiedCredentialType/getUserVerifiedCredentialType.cjs');
37
39
  var hasEmbeddedWallet = require('../../../functions/hasEmbeddedWallet/hasEmbeddedWallet.cjs');
38
40
  var getEmbeddedWalletAuthHandler = require('../../../functions/getEmbeddedWalletAuthHandler/getEmbeddedWalletAuthHandler.cjs');
39
41
  var getEmbeddedWalletSessionExpiration = require('../../../functions/getEmbeddedWalletSessionExpiration/getEmbeddedWalletSessionExpiration.cjs');
@@ -92,23 +94,38 @@ require('../../../../views/TransactionConfirmationView/helpers/transactionErrorM
92
94
  require('../../../../widgets/DynamicWidget/views/ManagePasskeysWidgetView/PasskeyCard/PasskeyCard.cjs');
93
95
  var useInternalDynamicContext = require('../../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext.cjs');
94
96
 
95
- // Hook exposed to customers and used internally to trigger dynamic embedded wallet creation
97
+ // Hook exposed to customers
96
98
  /**
99
+ *
97
100
  * @returns {
98
- * createEmbeddedWallet, - creates Dynamic or MPC embedded wallet according to the settings
99
- * isLoadingEmbeddedWallet, - loading state of the embedded wallet
100
- * userHasEmbeddedWallet, - checks if the user has an embedded wallet
101
+ * createEmbeddedWallet, - creates Secure enclave embedded wallet according to the settings
102
+ * createOrRestoreSession, - creates or restores a embedded wallet session
103
+ * createPasskey, - creates a new passkey both for an existing wallet or a wallet to be created
104
+ * getPasskeys, - gets all passkeys for the user
105
+ * isLoadingEmbeddedWallet, - loading state of the embedded wallet
106
+ * isSessionActive, - checks if the embedded wallet session is active
107
+ * sendOneTimeCode, - sends a one-time code to the user so they can create a session or add a new passkey
108
+ * userHasEmbeddedWallet, - checks if the user has an embedded wallet
101
109
  * }
102
110
  */
103
111
  const useSecureEnclaveEmbeddedWallet = () => {
104
112
  var _a, _b;
105
- const { projectSettings, onboardingOnlyJwt, primaryWallet, user, environmentId, } = useInternalDynamicContext.useInternalDynamicContext();
113
+ const { projectSettings, onboardingOnlyJwt, primaryWallet, user, environmentId, walletConnectorOptions, setUser, } = useInternalDynamicContext.useInternalDynamicContext();
106
114
  const { createTurnkeyWallet } = useTurnkey.useTurnkey();
107
115
  const { hasRecoveryEmail } = useIsTurnkeyWallet.useIsTurnkeyWallet();
108
116
  const turnkeyAuthIframeContainerRef = useElementById.useElementById(constants.iframeContainerId);
109
117
  const { isLoadingEmbeddedWallet, setIsLoadingEmbeddedWallet } = WalletContext.useWalletContext();
110
118
  const wallet = getEOAWallet.getEOAWallet(primaryWallet, (user === null || user === void 0 ? void 0 : user.verifiedCredentials) || []);
119
+ /**
120
+ * Checks if the user has an embedded wallet or not
121
+ * @returns boolean
122
+ */
111
123
  const userHasEmbeddedWallet = React.useCallback(() => hasEmbeddedWallet.hasEmbeddedWallet(getAuthToken.getAuthToken() || onboardingOnlyJwt, 'turnkey'), [onboardingOnlyJwt]);
124
+ /**
125
+ * Creates a new secure enclave embedded wallet according to the settings from the dashboard
126
+ * @param chain - optional chain parameter to create the wallet for
127
+ * @returns Promise<Wallet | undefined>
128
+ */
112
129
  const createEmbeddedWallet = React.useCallback((chain) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
113
130
  var _c, _d;
114
131
  const jwt = (_c = getAuthToken.getAuthToken()) !== null && _c !== void 0 ? _c : onboardingOnlyJwt;
@@ -125,31 +142,37 @@ const useSecureEnclaveEmbeddedWallet = () => {
125
142
  throw new utils.DynamicError('Manual mode must be enabled to create an embedded wallet for this user');
126
143
  }
127
144
  validateTurnkeyProviderEnabled.validateTurnkeyProviderEnabled(projectSettings);
128
- setIsLoadingEmbeddedWallet(true);
129
145
  // TEMP: immediately disable loading state
130
146
  setIsLoadingEmbeddedWallet(false);
131
- const wallet = yield createTurnkeyWallet(jwt, decodedJwt, chain);
132
- return wallet;
147
+ return createTurnkeyWallet(jwt, decodedJwt, chain);
133
148
  }), [
134
149
  createTurnkeyWallet,
135
150
  onboardingOnlyJwt,
136
151
  projectSettings,
137
152
  setIsLoadingEmbeddedWallet,
138
153
  ]);
139
- const createOrRestoreSession = React.useCallback((oneTimeCode) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
140
- var _e, _f, _g, _h, _j, _k, _l;
141
- const jwt = (_e = getAuthToken.getAuthToken()) !== null && _e !== void 0 ? _e : onboardingOnlyJwt;
154
+ /**
155
+ * Creates or restores a secure enclave embedded wallet session
156
+ * If it detects that the session is possible to be restored, it will restore it
157
+ * @param oneTimeCode - optional one-time code parameter. If not informed it tries to restore a session
158
+ * @returns Promise<'session_created' | 'session_restored'> - returns a string indicating the status of the session
159
+ */
160
+ const createOrRestoreSession = React.useCallback((_e) => _tslib.__awaiter(void 0, [_e], void 0, function* ({ oneTimeCode }) {
161
+ var _f, _g, _h, _j, _k, _l, _m;
162
+ const jwt = (_f = getAuthToken.getAuthToken()) !== null && _f !== void 0 ? _f : onboardingOnlyJwt;
142
163
  const { decodedJwt } = validateUserIsLoggedIn.validateUserIsLoggedIn(jwt);
143
164
  const turnkeyRecoveryHandler = getEmbeddedWalletAuthHandler.getEmbeddedWalletAuthHandler(wallet === null || wallet === void 0 ? void 0 : wallet.connector);
144
- // try to restore session if it's active or can be restored
145
- if (turnkeyRecoveryHandler.isSessionActive() ||
146
- passkeyRecovery.canRestoreEmbeddedWalletSession((_f = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _f === void 0 ? void 0 : _f.sessionKeyDuration)) {
165
+ if (turnkeyRecoveryHandler.isSessionActive()) {
166
+ return errors.ACTIVE_SESSION;
167
+ }
168
+ // try to restore session if possible
169
+ if (passkeyRecovery.canRestoreEmbeddedWalletSession((_g = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _g === void 0 ? void 0 : _g.sessionKeyDuration)) {
147
170
  try {
148
171
  yield passkeyRecovery.restoreEmbeddedWalletSession({
149
172
  authToken: jwt,
150
173
  iframeContainer: turnkeyAuthIframeContainerRef.current,
151
174
  iframeElementId: constants.iframeElementId,
152
- sessionExpiration: getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_h = (_g = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _g === void 0 ? void 0 : _g.embeddedWallets) === null || _h === void 0 ? void 0 : _h.sessionKeyDuration),
175
+ sessionExpiration: getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_j = (_h = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _h === void 0 ? void 0 : _h.embeddedWallets) === null || _j === void 0 ? void 0 : _j.sessionKeyDuration),
153
176
  wallet: primaryWallet,
154
177
  });
155
178
  return errors.SESSION_RESTORED;
@@ -158,15 +181,15 @@ const useSecureEnclaveEmbeddedWallet = () => {
158
181
  logger.logger.error('Failed to restore embedded wallet', err);
159
182
  }
160
183
  }
161
- // creates a new session
162
184
  if (!oneTimeCode) {
163
185
  throw new utils.DynamicError('One-time code is required to create a session.', errors.INVALID_REQUEST);
164
186
  }
187
+ // tries to create a new session with the informed one-time code
165
188
  // verify user has a turnkey wallet and email VC
166
189
  if (!userHasEmbeddedWallet() || !hasRecoveryEmail) {
167
190
  throw new utils.DynamicError('User does not have a secure enclave wallet or a verified email', errors.INVALID_WALLET_DATA);
168
191
  }
169
- const organizationId = (_l = (_k = (_j = decodedJwt.verifiedCredentials) === null || _j === void 0 ? void 0 : _j.find(({ walletName }) => walletName === null || walletName === void 0 ? void 0 : walletName.startsWith('turnkey'))) === null || _k === void 0 ? void 0 : _k.walletProperties) === null || _l === void 0 ? void 0 : _l.turnkeySubOrganizationId;
192
+ const organizationId = (_m = (_l = (_k = decodedJwt.verifiedCredentials) === null || _k === void 0 ? void 0 : _k.find(({ walletName }) => walletName === null || walletName === void 0 ? void 0 : walletName.startsWith('turnkey'))) === null || _l === void 0 ? void 0 : _l.walletProperties) === null || _m === void 0 ? void 0 : _m.turnkeySubOrganizationId;
170
193
  yield turnkeyRecoveryHandler.verifyRecoveryCode(oneTimeCode, organizationId);
171
194
  const sessionSettings = {
172
195
  createdAt: new Date().getTime(),
@@ -184,6 +207,89 @@ const useSecureEnclaveEmbeddedWallet = () => {
184
207
  userHasEmbeddedWallet,
185
208
  wallet === null || wallet === void 0 ? void 0 : wallet.connector,
186
209
  ]);
210
+ /**
211
+ * Creates a new passkey both for an existing wallet or a wallet to be created
212
+ * @param oneTimeCode: string | undefined,
213
+ *
214
+ * @returns {
215
+ * attestation: Attestation,
216
+ * challenge: string,
217
+ * displayName: string,
218
+ * }
219
+ */
220
+ const createPasskey = React.useCallback((_o) => _tslib.__awaiter(void 0, [_o], void 0, function* ({ oneTimeCode }) {
221
+ var _p, _q, _r;
222
+ const { decodedJwt, jwt } = validateUserIsLoggedIn.validateUserIsLoggedIn(getAuthToken.getAuthToken() || onboardingOnlyJwt);
223
+ validateTurnkeyProviderEnabled.validateTurnkeyProviderEnabled(projectSettings);
224
+ const turnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_p = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _p === void 0 ? void 0 : _p.chainConfigurations, decodedJwt.verifiedCredentials);
225
+ if (!(turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletConnector)) {
226
+ throw new utils.DynamicError('Wallet connector not found', errors.INVALID_WALLET_DATA);
227
+ }
228
+ const walletConnector = turnkeyWallet.walletConnector;
229
+ walletConnector.setEmail(user === null || user === void 0 ? void 0 : user.email);
230
+ if (!(user === null || user === void 0 ? void 0 : user.email)) {
231
+ const passkeyIdentifier = (user === null || user === void 0 ? void 0 : user.phoneNumber) ||
232
+ ((_q = user === null || user === void 0 ? void 0 : user.verifiedCredentials.find((vc) => vc.oauthDisplayName)) === null || _q === void 0 ? void 0 : _q.oauthDisplayName) ||
233
+ '';
234
+ walletConnector.setPasskeyIdentifier(passkeyIdentifier);
235
+ }
236
+ const hasEmailVC = getUserVerifiedCredentialType.getUserVerifiedCredentialType(decodedJwt, sdkApiCore.JwtVerifiedCredentialFormatEnum.Email);
237
+ // return a new passkey if the user doesn't have a wallet yet or
238
+ // none of the requirements to add a passkey to an existing wallet are met
239
+ if (!(turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.id) || !hasEmailVC) {
240
+ return walletConnector.getWebAuthnAttestation();
241
+ }
242
+ const organizationId = (_r = turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletProperties) === null || _r === void 0 ? void 0 : _r.turnkeySubOrganizationId;
243
+ if (!organizationId) {
244
+ throw new utils.DynamicError('No sub organization id found for the wallet', errors.INVALID_WALLET_DATA);
245
+ }
246
+ const turnkAuthenticatorHandler = getEmbeddedWalletAuthHandler.getEmbeddedWalletAuthHandler(walletConnector);
247
+ // add new passkey to the wallet through an active session
248
+ yield createOrRestoreSession({ oneTimeCode });
249
+ const { attestation, challenge, displayName } = yield walletConnector.getWebAuthnAttestation();
250
+ yield turnkAuthenticatorHandler.addPasskeyAuthenticator({
251
+ attestation,
252
+ challenge,
253
+ organizationId,
254
+ });
255
+ const passkeyResponse = yield embeddedWallets.completePasskeyRecovery({
256
+ attestation: attestation,
257
+ challenge,
258
+ environmentId,
259
+ userJwt: jwt,
260
+ walletId: turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.id,
261
+ });
262
+ const { jwt: updatedJwt, minifiedJwt } = passkeyResponse;
263
+ setUser(updateJWTAndCreateUserProfile.updateJWTAndCreateUserProfile(updatedJwt, minifiedJwt));
264
+ return { attestation, challenge, displayName };
265
+ }), [
266
+ createOrRestoreSession,
267
+ environmentId,
268
+ onboardingOnlyJwt,
269
+ projectSettings,
270
+ setUser,
271
+ user === null || user === void 0 ? void 0 : user.email,
272
+ user === null || user === void 0 ? void 0 : user.phoneNumber,
273
+ user === null || user === void 0 ? void 0 : user.verifiedCredentials,
274
+ walletConnectorOptions,
275
+ ]);
276
+ /**
277
+ * Gets all passkeys for the user
278
+ * @returns Promise<Passkey[]>
279
+ */
280
+ const getPasskeys = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
281
+ var _s;
282
+ const { jwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((_s = getAuthToken.getAuthToken()) !== null && _s !== void 0 ? _s : onboardingOnlyJwt);
283
+ const data = yield embeddedWallets.getUserPasskeys({
284
+ environmentId: environmentId,
285
+ userJwt: jwt,
286
+ });
287
+ return data.passkeys;
288
+ }), [environmentId, onboardingOnlyJwt]);
289
+ /**
290
+ * Checks if the embedded wallet session is active
291
+ * @returns boolean
292
+ */
187
293
  const isSessionActive = React.useMemo(() => {
188
294
  if (!(wallet === null || wallet === void 0 ? void 0 : wallet.connector))
189
295
  return false;
@@ -195,21 +301,25 @@ const useSecureEnclaveEmbeddedWallet = () => {
195
301
  return false;
196
302
  }
197
303
  }, [wallet === null || wallet === void 0 ? void 0 : wallet.connector]);
198
- const sendOneTimeCode = React.useCallback((_m) => _tslib.__awaiter(void 0, [_m], void 0, function* ({ address }) {
199
- var _o, _p;
200
- const { jwt, decodedJwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((_o = getAuthToken.getAuthToken()) !== null && _o !== void 0 ? _o : onboardingOnlyJwt);
304
+ /**
305
+ * Sends a one-time code to the user so they can create a session or add a new passkey
306
+ * @returns Promise<'code_sent'>
307
+ */
308
+ const sendOneTimeCode = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
309
+ var _t, _u, _v;
310
+ const { jwt, decodedJwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((_t = getAuthToken.getAuthToken()) !== null && _t !== void 0 ? _t : onboardingOnlyJwt);
201
311
  validateTurnkeyProviderEnabled.validateTurnkeyProviderEnabled(projectSettings);
202
- const targetTurnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByAddress(decodedJwt.verifiedCredentials, address);
312
+ const targetTurnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_u = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _u === void 0 ? void 0 : _u.chainConfigurations, decodedJwt.verifiedCredentials);
203
313
  if (!targetTurnkeyWallet || !targetTurnkeyWallet.id) {
204
314
  throw new utils.DynamicError('User does not have a valid secure enclave wallet', errors.INVALID_WALLET_DATA);
205
315
  }
206
- const turnkeyAuthenticatorHandler = getEmbeddedWalletAuthHandler.getEmbeddedWalletAuthHandler(wallet === null || wallet === void 0 ? void 0 : wallet.connector);
316
+ const turnkeyAuthenticatorHandler = getEmbeddedWalletAuthHandler.getEmbeddedWalletAuthHandler(targetTurnkeyWallet === null || targetTurnkeyWallet === void 0 ? void 0 : targetTurnkeyWallet.walletConnector);
207
317
  const targetTurnkeyWalletId = targetTurnkeyWallet.id;
208
318
  const isSessionActive = turnkeyAuthenticatorHandler.isSessionActive();
209
319
  if (isSessionActive) {
210
320
  throw new utils.DynamicError('Session is active. No need to create a new one', errors.ACTIVE_SESSION);
211
321
  }
212
- const publicKey = yield turnkeyAuthenticatorHandler.initRecovery('email', turnkeyAuthIframeContainerRef.current, 'dyn-turnkey-auth-element-id', getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_p = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _p === void 0 ? void 0 : _p.sessionKeyDuration));
322
+ const publicKey = yield turnkeyAuthenticatorHandler.initRecovery('email', turnkeyAuthIframeContainerRef.current, 'dyn-turnkey-auth-element-id', getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_v = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _v === void 0 ? void 0 : _v.sessionKeyDuration));
213
323
  if (!publicKey) {
214
324
  throw new utils.DynamicError(errors.ERROR_SENDING_CODE);
215
325
  }
@@ -227,11 +337,13 @@ const useSecureEnclaveEmbeddedWallet = () => {
227
337
  onboardingOnlyJwt,
228
338
  projectSettings,
229
339
  turnkeyAuthIframeContainerRef,
230
- wallet === null || wallet === void 0 ? void 0 : wallet.connector,
340
+ walletConnectorOptions,
231
341
  ]);
232
342
  return {
233
343
  createEmbeddedWallet,
234
344
  createOrRestoreSession,
345
+ createPasskey,
346
+ getPasskeys,
235
347
  isLoadingEmbeddedWallet,
236
348
  isSessionActive,
237
349
  sendOneTimeCode,
@@ -1,19 +1,29 @@
1
1
  import { ChainEnum } from '@dynamic-labs/sdk-api-core';
2
2
  import { Wallet } from '../../../../shared';
3
3
  /**
4
+ *
4
5
  * @returns {
5
- * createEmbeddedWallet, - creates Dynamic or MPC embedded wallet according to the settings
6
- * isLoadingEmbeddedWallet, - loading state of the embedded wallet
7
- * userHasEmbeddedWallet, - checks if the user has an embedded wallet
6
+ * createEmbeddedWallet, - creates Secure enclave embedded wallet according to the settings
7
+ * createOrRestoreSession, - creates or restores a embedded wallet session
8
+ * createPasskey, - creates a new passkey both for an existing wallet or a wallet to be created
9
+ * getPasskeys, - gets all passkeys for the user
10
+ * isLoadingEmbeddedWallet, - loading state of the embedded wallet
11
+ * isSessionActive, - checks if the embedded wallet session is active
12
+ * sendOneTimeCode, - sends a one-time code to the user so they can create a session or add a new passkey
13
+ * userHasEmbeddedWallet, - checks if the user has an embedded wallet
8
14
  * }
9
15
  */
10
16
  export declare const useSecureEnclaveEmbeddedWallet: () => {
11
17
  readonly createEmbeddedWallet: (chain?: ChainEnum) => Promise<Wallet | undefined>;
12
- readonly createOrRestoreSession: (oneTimeCode?: string) => Promise<string>;
18
+ readonly createOrRestoreSession: ({ oneTimeCode }: {
19
+ oneTimeCode?: string;
20
+ }) => Promise<string>;
21
+ readonly createPasskey: ({ oneTimeCode }: {
22
+ oneTimeCode?: string;
23
+ }) => Promise<import("@dynamic-labs/wallet-connector-core").WebAuthnAttestation>;
24
+ readonly getPasskeys: () => Promise<import("@dynamic-labs/sdk-api-core").UserPasskey[]>;
13
25
  readonly isLoadingEmbeddedWallet: boolean;
14
26
  readonly isSessionActive: boolean;
15
- readonly sendOneTimeCode: ({ address }: {
16
- address: string;
17
- }) => Promise<string>;
27
+ readonly sendOneTimeCode: () => Promise<string>;
18
28
  readonly userHasEmbeddedWallet: () => boolean;
19
29
  };
@@ -1,9 +1,9 @@
1
1
  'use client'
2
2
  import { __awaiter } from '../../../../../../_virtual/_tslib.js';
3
3
  import { useCallback, useMemo } from 'react';
4
+ import { JwtVerifiedCredentialFormatEnum } from '@dynamic-labs/sdk-api-core';
4
5
  import { DynamicError } from '@dynamic-labs/utils';
5
6
  import '../../../../context/DynamicContext/DynamicContext.js';
6
- import '@dynamic-labs/sdk-api-core';
7
7
  import { logger } from '../../../../shared/logger.js';
8
8
  import '@dynamic-labs/iconic';
9
9
  import '@dynamic-labs/wallet-connector-core';
@@ -19,7 +19,7 @@ import '../../../../events/dynamicEvents.js';
19
19
  import '../../../../context/CaptchaContext/CaptchaContext.js';
20
20
  import '../../../../context/ErrorContext/ErrorContext.js';
21
21
  import { findEmbeddedWalletFromVerifiedCredentials } from '../../../functions/findEmbeddedWalletFromVerifiedCredentials/findEmbeddedWalletFromVerifiedCredentials.js';
22
- import { findTurnkeyWalletByAddress } from '../../../functions/findTurnkeyWallet/findTurnkeyWallet.js';
22
+ import { findTurnkeyWalletByPrimaryChain } from '../../../functions/findTurnkeyWallet/findTurnkeyWallet.js';
23
23
  import '@dynamic-labs/multi-wallet';
24
24
  import { getAuthToken } from '../../../functions/getAuthToken/getAuthToken.js';
25
25
  import 'react-international-phone';
@@ -28,8 +28,10 @@ import 'viem';
28
28
  import 'viem/chains';
29
29
  import { getEOAWallet } from '../../../functions/getEOAWallet/getEOAWallet.js';
30
30
  import '../../../../config/ApiEndpoint.js';
31
- import { initEmbeddedWalletSession } from '../../../../data/api/embeddedWallets/embeddedWallets.js';
31
+ import { completePasskeyRecovery, getUserPasskeys, initEmbeddedWalletSession } from '../../../../data/api/embeddedWallets/embeddedWallets.js';
32
32
  import '../../../../locale/locale.js';
33
+ import { updateJWTAndCreateUserProfile } from '../../../functions/updateJWTAndCreateUserProfile/updateJWTAndCreateUserProfile.js';
34
+ import { getUserVerifiedCredentialType } from '../../../functions/getUserVerifiedCredentialType/getUserVerifiedCredentialType.js';
33
35
  import { hasEmbeddedWallet } from '../../../functions/hasEmbeddedWallet/hasEmbeddedWallet.js';
34
36
  import { getEmbeddedWalletAuthHandler } from '../../../functions/getEmbeddedWalletAuthHandler/getEmbeddedWalletAuthHandler.js';
35
37
  import { getEmbeddedWalletSessionExpiration } from '../../../functions/getEmbeddedWalletSessionExpiration/getEmbeddedWalletSessionExpiration.js';
@@ -42,7 +44,7 @@ import { useElementById } from '../../useElementById/useElementById.js';
42
44
  import { useWalletContext } from '../../../../context/WalletContext/WalletContext.js';
43
45
  import { validateUserIsLoggedIn } from '../../../validations/validateUserIsLoggedIn/validateUserIsLoggedIn.js';
44
46
  import { validateTurnkeyProviderEnabled } from '../../../validations/validateTurnkeyProviderEnabled/validateTurnkeyProviderEnabled.js';
45
- import { SESSION_RESTORED, INVALID_REQUEST, INVALID_WALLET_DATA, SESSION_CREATED, ACTIVE_SESSION, ERROR_SENDING_CODE, CODE_SENT } from '../../../constants/errors.js';
47
+ import { ACTIVE_SESSION, SESSION_RESTORED, INVALID_REQUEST, INVALID_WALLET_DATA, SESSION_CREATED, ERROR_SENDING_CODE, CODE_SENT } from '../../../constants/errors.js';
46
48
  import { useIsTurnkeyWallet } from '../../useIsTurnkeyWallet/useIsTurnkeyWallet.js';
47
49
  import { canRestoreEmbeddedWalletSession, restoreEmbeddedWalletSession } from '../../../../views/Passkey/utils/passkeyRecovery/passkeyRecovery.js';
48
50
  import { useTurnkey } from './useTurnkey/useTurnkey.js';
@@ -88,23 +90,38 @@ import '../../../../views/TransactionConfirmationView/helpers/transactionErrorMe
88
90
  import '../../../../widgets/DynamicWidget/views/ManagePasskeysWidgetView/PasskeyCard/PasskeyCard.js';
89
91
  import { useInternalDynamicContext } from '../../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext.js';
90
92
 
91
- // Hook exposed to customers and used internally to trigger dynamic embedded wallet creation
93
+ // Hook exposed to customers
92
94
  /**
95
+ *
93
96
  * @returns {
94
- * createEmbeddedWallet, - creates Dynamic or MPC embedded wallet according to the settings
95
- * isLoadingEmbeddedWallet, - loading state of the embedded wallet
96
- * userHasEmbeddedWallet, - checks if the user has an embedded wallet
97
+ * createEmbeddedWallet, - creates Secure enclave embedded wallet according to the settings
98
+ * createOrRestoreSession, - creates or restores a embedded wallet session
99
+ * createPasskey, - creates a new passkey both for an existing wallet or a wallet to be created
100
+ * getPasskeys, - gets all passkeys for the user
101
+ * isLoadingEmbeddedWallet, - loading state of the embedded wallet
102
+ * isSessionActive, - checks if the embedded wallet session is active
103
+ * sendOneTimeCode, - sends a one-time code to the user so they can create a session or add a new passkey
104
+ * userHasEmbeddedWallet, - checks if the user has an embedded wallet
97
105
  * }
98
106
  */
99
107
  const useSecureEnclaveEmbeddedWallet = () => {
100
108
  var _a, _b;
101
- const { projectSettings, onboardingOnlyJwt, primaryWallet, user, environmentId, } = useInternalDynamicContext();
109
+ const { projectSettings, onboardingOnlyJwt, primaryWallet, user, environmentId, walletConnectorOptions, setUser, } = useInternalDynamicContext();
102
110
  const { createTurnkeyWallet } = useTurnkey();
103
111
  const { hasRecoveryEmail } = useIsTurnkeyWallet();
104
112
  const turnkeyAuthIframeContainerRef = useElementById(iframeContainerId);
105
113
  const { isLoadingEmbeddedWallet, setIsLoadingEmbeddedWallet } = useWalletContext();
106
114
  const wallet = getEOAWallet(primaryWallet, (user === null || user === void 0 ? void 0 : user.verifiedCredentials) || []);
115
+ /**
116
+ * Checks if the user has an embedded wallet or not
117
+ * @returns boolean
118
+ */
107
119
  const userHasEmbeddedWallet = useCallback(() => hasEmbeddedWallet(getAuthToken() || onboardingOnlyJwt, 'turnkey'), [onboardingOnlyJwt]);
120
+ /**
121
+ * Creates a new secure enclave embedded wallet according to the settings from the dashboard
122
+ * @param chain - optional chain parameter to create the wallet for
123
+ * @returns Promise<Wallet | undefined>
124
+ */
108
125
  const createEmbeddedWallet = useCallback((chain) => __awaiter(void 0, void 0, void 0, function* () {
109
126
  var _c, _d;
110
127
  const jwt = (_c = getAuthToken()) !== null && _c !== void 0 ? _c : onboardingOnlyJwt;
@@ -121,31 +138,37 @@ const useSecureEnclaveEmbeddedWallet = () => {
121
138
  throw new DynamicError('Manual mode must be enabled to create an embedded wallet for this user');
122
139
  }
123
140
  validateTurnkeyProviderEnabled(projectSettings);
124
- setIsLoadingEmbeddedWallet(true);
125
141
  // TEMP: immediately disable loading state
126
142
  setIsLoadingEmbeddedWallet(false);
127
- const wallet = yield createTurnkeyWallet(jwt, decodedJwt, chain);
128
- return wallet;
143
+ return createTurnkeyWallet(jwt, decodedJwt, chain);
129
144
  }), [
130
145
  createTurnkeyWallet,
131
146
  onboardingOnlyJwt,
132
147
  projectSettings,
133
148
  setIsLoadingEmbeddedWallet,
134
149
  ]);
135
- const createOrRestoreSession = useCallback((oneTimeCode) => __awaiter(void 0, void 0, void 0, function* () {
136
- var _e, _f, _g, _h, _j, _k, _l;
137
- const jwt = (_e = getAuthToken()) !== null && _e !== void 0 ? _e : onboardingOnlyJwt;
150
+ /**
151
+ * Creates or restores a secure enclave embedded wallet session
152
+ * If it detects that the session is possible to be restored, it will restore it
153
+ * @param oneTimeCode - optional one-time code parameter. If not informed it tries to restore a session
154
+ * @returns Promise<'session_created' | 'session_restored'> - returns a string indicating the status of the session
155
+ */
156
+ const createOrRestoreSession = useCallback((_e) => __awaiter(void 0, [_e], void 0, function* ({ oneTimeCode }) {
157
+ var _f, _g, _h, _j, _k, _l, _m;
158
+ const jwt = (_f = getAuthToken()) !== null && _f !== void 0 ? _f : onboardingOnlyJwt;
138
159
  const { decodedJwt } = validateUserIsLoggedIn(jwt);
139
160
  const turnkeyRecoveryHandler = getEmbeddedWalletAuthHandler(wallet === null || wallet === void 0 ? void 0 : wallet.connector);
140
- // try to restore session if it's active or can be restored
141
- if (turnkeyRecoveryHandler.isSessionActive() ||
142
- canRestoreEmbeddedWalletSession((_f = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _f === void 0 ? void 0 : _f.sessionKeyDuration)) {
161
+ if (turnkeyRecoveryHandler.isSessionActive()) {
162
+ return ACTIVE_SESSION;
163
+ }
164
+ // try to restore session if possible
165
+ if (canRestoreEmbeddedWalletSession((_g = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _g === void 0 ? void 0 : _g.sessionKeyDuration)) {
143
166
  try {
144
167
  yield restoreEmbeddedWalletSession({
145
168
  authToken: jwt,
146
169
  iframeContainer: turnkeyAuthIframeContainerRef.current,
147
170
  iframeElementId,
148
- sessionExpiration: getEmbeddedWalletSessionExpiration((_h = (_g = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _g === void 0 ? void 0 : _g.embeddedWallets) === null || _h === void 0 ? void 0 : _h.sessionKeyDuration),
171
+ sessionExpiration: getEmbeddedWalletSessionExpiration((_j = (_h = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _h === void 0 ? void 0 : _h.embeddedWallets) === null || _j === void 0 ? void 0 : _j.sessionKeyDuration),
149
172
  wallet: primaryWallet,
150
173
  });
151
174
  return SESSION_RESTORED;
@@ -154,15 +177,15 @@ const useSecureEnclaveEmbeddedWallet = () => {
154
177
  logger.error('Failed to restore embedded wallet', err);
155
178
  }
156
179
  }
157
- // creates a new session
158
180
  if (!oneTimeCode) {
159
181
  throw new DynamicError('One-time code is required to create a session.', INVALID_REQUEST);
160
182
  }
183
+ // tries to create a new session with the informed one-time code
161
184
  // verify user has a turnkey wallet and email VC
162
185
  if (!userHasEmbeddedWallet() || !hasRecoveryEmail) {
163
186
  throw new DynamicError('User does not have a secure enclave wallet or a verified email', INVALID_WALLET_DATA);
164
187
  }
165
- const organizationId = (_l = (_k = (_j = decodedJwt.verifiedCredentials) === null || _j === void 0 ? void 0 : _j.find(({ walletName }) => walletName === null || walletName === void 0 ? void 0 : walletName.startsWith('turnkey'))) === null || _k === void 0 ? void 0 : _k.walletProperties) === null || _l === void 0 ? void 0 : _l.turnkeySubOrganizationId;
188
+ const organizationId = (_m = (_l = (_k = decodedJwt.verifiedCredentials) === null || _k === void 0 ? void 0 : _k.find(({ walletName }) => walletName === null || walletName === void 0 ? void 0 : walletName.startsWith('turnkey'))) === null || _l === void 0 ? void 0 : _l.walletProperties) === null || _m === void 0 ? void 0 : _m.turnkeySubOrganizationId;
166
189
  yield turnkeyRecoveryHandler.verifyRecoveryCode(oneTimeCode, organizationId);
167
190
  const sessionSettings = {
168
191
  createdAt: new Date().getTime(),
@@ -180,6 +203,89 @@ const useSecureEnclaveEmbeddedWallet = () => {
180
203
  userHasEmbeddedWallet,
181
204
  wallet === null || wallet === void 0 ? void 0 : wallet.connector,
182
205
  ]);
206
+ /**
207
+ * Creates a new passkey both for an existing wallet or a wallet to be created
208
+ * @param oneTimeCode: string | undefined,
209
+ *
210
+ * @returns {
211
+ * attestation: Attestation,
212
+ * challenge: string,
213
+ * displayName: string,
214
+ * }
215
+ */
216
+ const createPasskey = useCallback((_o) => __awaiter(void 0, [_o], void 0, function* ({ oneTimeCode }) {
217
+ var _p, _q, _r;
218
+ const { decodedJwt, jwt } = validateUserIsLoggedIn(getAuthToken() || onboardingOnlyJwt);
219
+ validateTurnkeyProviderEnabled(projectSettings);
220
+ const turnkeyWallet = findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_p = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _p === void 0 ? void 0 : _p.chainConfigurations, decodedJwt.verifiedCredentials);
221
+ if (!(turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletConnector)) {
222
+ throw new DynamicError('Wallet connector not found', INVALID_WALLET_DATA);
223
+ }
224
+ const walletConnector = turnkeyWallet.walletConnector;
225
+ walletConnector.setEmail(user === null || user === void 0 ? void 0 : user.email);
226
+ if (!(user === null || user === void 0 ? void 0 : user.email)) {
227
+ const passkeyIdentifier = (user === null || user === void 0 ? void 0 : user.phoneNumber) ||
228
+ ((_q = user === null || user === void 0 ? void 0 : user.verifiedCredentials.find((vc) => vc.oauthDisplayName)) === null || _q === void 0 ? void 0 : _q.oauthDisplayName) ||
229
+ '';
230
+ walletConnector.setPasskeyIdentifier(passkeyIdentifier);
231
+ }
232
+ const hasEmailVC = getUserVerifiedCredentialType(decodedJwt, JwtVerifiedCredentialFormatEnum.Email);
233
+ // return a new passkey if the user doesn't have a wallet yet or
234
+ // none of the requirements to add a passkey to an existing wallet are met
235
+ if (!(turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.id) || !hasEmailVC) {
236
+ return walletConnector.getWebAuthnAttestation();
237
+ }
238
+ const organizationId = (_r = turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletProperties) === null || _r === void 0 ? void 0 : _r.turnkeySubOrganizationId;
239
+ if (!organizationId) {
240
+ throw new DynamicError('No sub organization id found for the wallet', INVALID_WALLET_DATA);
241
+ }
242
+ const turnkAuthenticatorHandler = getEmbeddedWalletAuthHandler(walletConnector);
243
+ // add new passkey to the wallet through an active session
244
+ yield createOrRestoreSession({ oneTimeCode });
245
+ const { attestation, challenge, displayName } = yield walletConnector.getWebAuthnAttestation();
246
+ yield turnkAuthenticatorHandler.addPasskeyAuthenticator({
247
+ attestation,
248
+ challenge,
249
+ organizationId,
250
+ });
251
+ const passkeyResponse = yield completePasskeyRecovery({
252
+ attestation: attestation,
253
+ challenge,
254
+ environmentId,
255
+ userJwt: jwt,
256
+ walletId: turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.id,
257
+ });
258
+ const { jwt: updatedJwt, minifiedJwt } = passkeyResponse;
259
+ setUser(updateJWTAndCreateUserProfile(updatedJwt, minifiedJwt));
260
+ return { attestation, challenge, displayName };
261
+ }), [
262
+ createOrRestoreSession,
263
+ environmentId,
264
+ onboardingOnlyJwt,
265
+ projectSettings,
266
+ setUser,
267
+ user === null || user === void 0 ? void 0 : user.email,
268
+ user === null || user === void 0 ? void 0 : user.phoneNumber,
269
+ user === null || user === void 0 ? void 0 : user.verifiedCredentials,
270
+ walletConnectorOptions,
271
+ ]);
272
+ /**
273
+ * Gets all passkeys for the user
274
+ * @returns Promise<Passkey[]>
275
+ */
276
+ const getPasskeys = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
277
+ var _s;
278
+ const { jwt } = validateUserIsLoggedIn((_s = getAuthToken()) !== null && _s !== void 0 ? _s : onboardingOnlyJwt);
279
+ const data = yield getUserPasskeys({
280
+ environmentId: environmentId,
281
+ userJwt: jwt,
282
+ });
283
+ return data.passkeys;
284
+ }), [environmentId, onboardingOnlyJwt]);
285
+ /**
286
+ * Checks if the embedded wallet session is active
287
+ * @returns boolean
288
+ */
183
289
  const isSessionActive = useMemo(() => {
184
290
  if (!(wallet === null || wallet === void 0 ? void 0 : wallet.connector))
185
291
  return false;
@@ -191,21 +297,25 @@ const useSecureEnclaveEmbeddedWallet = () => {
191
297
  return false;
192
298
  }
193
299
  }, [wallet === null || wallet === void 0 ? void 0 : wallet.connector]);
194
- const sendOneTimeCode = useCallback((_m) => __awaiter(void 0, [_m], void 0, function* ({ address }) {
195
- var _o, _p;
196
- const { jwt, decodedJwt } = validateUserIsLoggedIn((_o = getAuthToken()) !== null && _o !== void 0 ? _o : onboardingOnlyJwt);
300
+ /**
301
+ * Sends a one-time code to the user so they can create a session or add a new passkey
302
+ * @returns Promise<'code_sent'>
303
+ */
304
+ const sendOneTimeCode = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
305
+ var _t, _u, _v;
306
+ const { jwt, decodedJwt } = validateUserIsLoggedIn((_t = getAuthToken()) !== null && _t !== void 0 ? _t : onboardingOnlyJwt);
197
307
  validateTurnkeyProviderEnabled(projectSettings);
198
- const targetTurnkeyWallet = findTurnkeyWalletByAddress(decodedJwt.verifiedCredentials, address);
308
+ const targetTurnkeyWallet = findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_u = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _u === void 0 ? void 0 : _u.chainConfigurations, decodedJwt.verifiedCredentials);
199
309
  if (!targetTurnkeyWallet || !targetTurnkeyWallet.id) {
200
310
  throw new DynamicError('User does not have a valid secure enclave wallet', INVALID_WALLET_DATA);
201
311
  }
202
- const turnkeyAuthenticatorHandler = getEmbeddedWalletAuthHandler(wallet === null || wallet === void 0 ? void 0 : wallet.connector);
312
+ const turnkeyAuthenticatorHandler = getEmbeddedWalletAuthHandler(targetTurnkeyWallet === null || targetTurnkeyWallet === void 0 ? void 0 : targetTurnkeyWallet.walletConnector);
203
313
  const targetTurnkeyWalletId = targetTurnkeyWallet.id;
204
314
  const isSessionActive = turnkeyAuthenticatorHandler.isSessionActive();
205
315
  if (isSessionActive) {
206
316
  throw new DynamicError('Session is active. No need to create a new one', ACTIVE_SESSION);
207
317
  }
208
- const publicKey = yield turnkeyAuthenticatorHandler.initRecovery('email', turnkeyAuthIframeContainerRef.current, 'dyn-turnkey-auth-element-id', getEmbeddedWalletSessionExpiration((_p = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _p === void 0 ? void 0 : _p.sessionKeyDuration));
318
+ const publicKey = yield turnkeyAuthenticatorHandler.initRecovery('email', turnkeyAuthIframeContainerRef.current, 'dyn-turnkey-auth-element-id', getEmbeddedWalletSessionExpiration((_v = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _v === void 0 ? void 0 : _v.sessionKeyDuration));
209
319
  if (!publicKey) {
210
320
  throw new DynamicError(ERROR_SENDING_CODE);
211
321
  }
@@ -223,11 +333,13 @@ const useSecureEnclaveEmbeddedWallet = () => {
223
333
  onboardingOnlyJwt,
224
334
  projectSettings,
225
335
  turnkeyAuthIframeContainerRef,
226
- wallet === null || wallet === void 0 ? void 0 : wallet.connector,
336
+ walletConnectorOptions,
227
337
  ]);
228
338
  return {
229
339
  createEmbeddedWallet,
230
340
  createOrRestoreSession,
341
+ createPasskey,
342
+ getPasskeys,
231
343
  isLoadingEmbeddedWallet,
232
344
  isSessionActive,
233
345
  sendOneTimeCode,
@@ -21,6 +21,11 @@ require('../../../../../_virtual/_tslib.cjs');
21
21
  require('../../../config/ApiEndpoint.cjs');
22
22
  var settings = require('../../../data/api/settings/settings.cjs');
23
23
  require('../../../locale/locale.cjs');
24
+ require('@dynamic-labs/multi-wallet');
25
+ require('react-international-phone');
26
+ require('viem');
27
+ require('viem/chains');
28
+ var serializeWalletConnectors = require('../../functions/serializeWalletConnectors/serializeWalletConnectors.cjs');
24
29
 
25
30
  const useSendDynamicProps = ({ settings: settings$1, environmentId, }) => {
26
31
  useEffectOnce.useEffectOnce(() => {
@@ -32,7 +37,7 @@ const useSendDynamicProps = ({ settings: settings$1, environmentId, }) => {
32
37
  settings: Object.assign(Object.assign({}, settings$1), { customPrivacyPolicy: Boolean(settings$1.customPrivacyPolicy), customTermsOfServices: Boolean(settings$1.customTermsOfServices), policiesConsentInnerComponent: Boolean(settings$1.policiesConsentInnerComponent) }),
33
38
  };
34
39
  const serializedEventsCallbacks = serializeEventsCallbacks(settings$1.events);
35
- const serializedWalletConnectors = serializeWalletConnectors(settings$1.walletConnectors);
40
+ const serializedWalletConnectors = serializeWalletConnectors.serializeWalletConnectors(settings$1.walletConnectors);
36
41
  const serializedDynamicContextProps = Object.assign(Object.assign({}, updatedDynamicProps), { settings: Object.assign(Object.assign({}, updatedDynamicProps.settings), { events: serializedEventsCallbacks, walletConnectors: serializedWalletConnectors }) });
37
42
  settings.sendDynamicProps(environmentId, {
38
43
  dynamicContextProps: serializedDynamicContextProps,
@@ -58,17 +63,6 @@ const serializeEventsCallbacks = (events) => {
58
63
  return undefined;
59
64
  }
60
65
  };
61
- const serializeWalletConnectors = (walletConnectors) => {
62
- try {
63
- if (!walletConnectors)
64
- return undefined;
65
- return walletConnectors.map((connector) => connector.name);
66
- }
67
- catch (error) {
68
- logger.logger.error('error serializing walletConnectors', error);
69
- return undefined;
70
- }
71
- };
72
66
  const getFrameworkSettings = () => {
73
67
  var _a;
74
68
  return ({
@@ -84,5 +78,4 @@ const getFrameworkSettings = () => {
84
78
  };
85
79
 
86
80
  exports.serializeEventsCallbacks = serializeEventsCallbacks;
87
- exports.serializeWalletConnectors = serializeWalletConnectors;
88
81
  exports.useSendDynamicProps = useSendDynamicProps;