@dynamic-labs/legacy-embedded-wallet-migration 0.0.0 → 5.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/CHANGELOG.md +6718 -0
  2. package/LICENSE +21 -0
  3. package/README.md +5 -0
  4. package/_virtual/_tslib.js +32 -0
  5. package/package.js +4 -0
  6. package/package.json +31 -1
  7. package/src/index.d.ts +11 -0
  8. package/src/index.js +16 -0
  9. package/src/lib/constants.d.ts +8 -0
  10. package/src/lib/constants.js +12 -0
  11. package/src/lib/export/cleanupExport/cleanupExport.d.ts +4 -0
  12. package/src/lib/export/cleanupExport/cleanupExport.js +11 -0
  13. package/src/lib/export/cleanupExport/index.d.ts +1 -0
  14. package/src/lib/export/exportCredential/exportCredential.d.ts +7 -0
  15. package/src/lib/export/exportCredential/exportCredential.js +63 -0
  16. package/src/lib/export/exportCredential/index.d.ts +1 -0
  17. package/src/lib/export/exportEmbeddedWallet/exportEmbeddedWallet.d.ts +7 -0
  18. package/src/lib/export/exportEmbeddedWallet/exportEmbeddedWallet.js +21 -0
  19. package/src/lib/export/exportEmbeddedWallet/index.d.ts +1 -0
  20. package/src/lib/export/exportTurnkeyWalletCredential/exportTurnkeyWalletCredential.d.ts +9 -0
  21. package/src/lib/export/exportTurnkeyWalletCredential/exportTurnkeyWalletCredential.js +30 -0
  22. package/src/lib/export/exportTurnkeyWalletCredential/index.d.ts +1 -0
  23. package/src/lib/export/extractExportBundle/extractExportBundle.d.ts +5 -0
  24. package/src/lib/export/extractExportBundle/extractExportBundle.js +13 -0
  25. package/src/lib/export/extractExportBundle/index.d.ts +1 -0
  26. package/src/lib/export/handleExportInitCheck/handleExportInitCheck.d.ts +12 -0
  27. package/src/lib/export/handleExportInitCheck/handleExportInitCheck.js +34 -0
  28. package/src/lib/export/handleExportInitCheck/index.d.ts +1 -0
  29. package/src/lib/export/initExport/index.d.ts +1 -0
  30. package/src/lib/export/initExport/initExport.d.ts +6 -0
  31. package/src/lib/export/initExport/initExport.js +22 -0
  32. package/src/lib/getTurnkeyWalletId/getTurnkeyWalletId.d.ts +8 -0
  33. package/src/lib/getTurnkeyWalletId/getTurnkeyWalletId.js +27 -0
  34. package/src/lib/getTurnkeyWalletId/index.d.ts +1 -0
  35. package/src/lib/recovery/addEmailRecovery/addEmailRecovery.d.ts +7 -0
  36. package/src/lib/recovery/addEmailRecovery/addEmailRecovery.js +50 -0
  37. package/src/lib/recovery/addEmailRecovery/index.d.ts +1 -0
  38. package/src/lib/recovery/addNewPasskeyAuthenticator/addNewPasskeyAuthenticator.d.ts +7 -0
  39. package/src/lib/recovery/addNewPasskeyAuthenticator/addNewPasskeyAuthenticator.js +14 -0
  40. package/src/lib/recovery/addNewPasskeyAuthenticator/index.d.ts +1 -0
  41. package/src/lib/recovery/canRestoreEmbeddedWalletSession/canRestoreEmbeddedWalletSession.d.ts +2 -0
  42. package/src/lib/recovery/canRestoreEmbeddedWalletSession/canRestoreEmbeddedWalletSession.js +24 -0
  43. package/src/lib/recovery/canRestoreEmbeddedWalletSession/index.d.ts +1 -0
  44. package/src/lib/recovery/completePasskeyRecovery/completePasskeyRecovery.d.ts +7 -0
  45. package/src/lib/recovery/completePasskeyRecovery/completePasskeyRecovery.js +26 -0
  46. package/src/lib/recovery/completePasskeyRecovery/index.d.ts +1 -0
  47. package/src/lib/recovery/constants.d.ts +3 -0
  48. package/src/lib/recovery/constants.js +14 -0
  49. package/src/lib/recovery/index.d.ts +13 -0
  50. package/src/lib/recovery/initEmbeddedWalletSession/index.d.ts +1 -0
  51. package/src/lib/recovery/initEmbeddedWalletSession/initEmbeddedWalletSession.d.ts +11 -0
  52. package/src/lib/recovery/initEmbeddedWalletSession/initEmbeddedWalletSession.js +56 -0
  53. package/src/lib/recovery/passkeyRecoveryBundleValidation/index.d.ts +1 -0
  54. package/src/lib/recovery/passkeyRecoveryBundleValidation/passkeyRecoveryBundleValidation.d.ts +7 -0
  55. package/src/lib/recovery/passkeyRecoveryBundleValidation/passkeyRecoveryBundleValidation.js +32 -0
  56. package/src/lib/recovery/recoverTurnkeyWallet/index.d.ts +1 -0
  57. package/src/lib/recovery/recoverTurnkeyWallet/recoverTurnkeyWallet.d.ts +11 -0
  58. package/src/lib/recovery/recoverTurnkeyWallet/recoverTurnkeyWallet.js +72 -0
  59. package/src/lib/recovery/resentRecoveryEmail/index.d.ts +1 -0
  60. package/src/lib/recovery/resentRecoveryEmail/resentRecoveryEmail.d.ts +7 -0
  61. package/src/lib/recovery/resentRecoveryEmail/resentRecoveryEmail.js +43 -0
  62. package/src/lib/recovery/restoreEmbeddedWalletSession/index.d.ts +1 -0
  63. package/src/lib/recovery/restoreEmbeddedWalletSession/restoreEmbeddedWalletSession.d.ts +9 -0
  64. package/src/lib/recovery/restoreEmbeddedWalletSession/restoreEmbeddedWalletSession.js +33 -0
  65. package/src/lib/recovery/types.d.ts +5 -0
  66. package/src/lib/recovery/useEmbeddedWalletAuthenticator/index.d.ts +1 -0
  67. package/src/lib/recovery/useEmbeddedWalletAuthenticator/useEmbeddedWalletAuthenticator.d.ts +11 -0
  68. package/src/lib/recovery/useInitEmbeddedWalletAuthMethod/index.d.ts +1 -0
  69. package/src/lib/recovery/useInitEmbeddedWalletAuthMethod/useInitEmbeddedWalletAuthMethod.d.ts +29 -0
  70. package/src/lib/recovery/useInitEmbeddedWalletAuthMethod/useInitEmbeddedWalletAuthMethod.js +50 -0
  71. package/src/lib/recovery/usePasskeyRecovery/index.d.ts +1 -0
  72. package/src/lib/recovery/usePasskeyRecovery/usePasskeyRecovery.d.ts +32 -0
  73. package/src/lib/recovery/usePasskeyRecovery/usePasskeyRecovery.js +197 -0
  74. package/src/lib/restoreEmbeddedWallet/index.d.ts +1 -0
  75. package/src/lib/restoreEmbeddedWallet/restoreEmbeddedWallet.d.ts +5 -0
  76. package/src/lib/restoreEmbeddedWallet/restoreEmbeddedWallet.js +21 -0
  77. package/src/lib/sessionKeys/base64urlDecode/base64urlDecode.d.ts +1 -0
  78. package/src/lib/sessionKeys/base64urlDecode/base64urlDecode.js +12 -0
  79. package/src/lib/sessionKeys/base64urlDecode/index.d.ts +1 -0
  80. package/src/lib/sessionKeys/buf2hex/buf2hex.d.ts +1 -0
  81. package/src/lib/sessionKeys/buf2hex/buf2hex.js +7 -0
  82. package/src/lib/sessionKeys/buf2hex/index.d.ts +1 -0
  83. package/src/lib/sessionKeys/compressRawPublicKey/compressRawPublicKey.d.ts +1 -0
  84. package/src/lib/sessionKeys/compressRawPublicKey/compressRawPublicKey.js +15 -0
  85. package/src/lib/sessionKeys/compressRawPublicKey/index.d.ts +1 -0
  86. package/src/lib/sessionKeys/generateAndSaveSessionKey/generateAndSaveSessionKey.d.ts +7 -0
  87. package/src/lib/sessionKeys/generateAndSaveSessionKey/generateAndSaveSessionKey.js +19 -0
  88. package/src/lib/sessionKeys/generateAndSaveSessionKey/index.d.ts +1 -0
  89. package/src/lib/sessionKeys/generateSessionKey/generateSessionKey.d.ts +13 -0
  90. package/src/lib/sessionKeys/generateSessionKey/generateSessionKey.js +20 -0
  91. package/src/lib/sessionKeys/generateSessionKey/index.d.ts +1 -0
  92. package/src/lib/sessionKeys/getDecodedSessionKeys/getDecodedSessionKeys.d.ts +2 -0
  93. package/src/lib/sessionKeys/getDecodedSessionKeys/getDecodedSessionKeys.js +28 -0
  94. package/src/lib/sessionKeys/getDecodedSessionKeys/index.d.ts +1 -0
  95. package/src/lib/sessionKeys/getSessionNonceHeaders/getSessionNonceHeaders.d.ts +6 -0
  96. package/src/lib/sessionKeys/getSessionNonceHeaders/getSessionNonceHeaders.js +19 -0
  97. package/src/lib/sessionKeys/getSessionNonceHeaders/index.d.ts +1 -0
  98. package/src/lib/sessionKeys/p256Keygen/index.d.ts +1 -0
  99. package/src/lib/sessionKeys/p256Keygen/p256Keygen.d.ts +11 -0
  100. package/src/lib/sessionKeys/p256Keygen/p256Keygen.js +26 -0
  101. package/src/lib/sessionKeys/p256Sign/index.d.ts +1 -0
  102. package/src/lib/sessionKeys/p256Sign/p256Sign.d.ts +1 -0
  103. package/src/lib/sessionKeys/p256Sign/p256Sign.js +17 -0
  104. package/src/lib/sessionKeys/registerSessionKey/index.d.ts +1 -0
  105. package/src/lib/sessionKeys/registerSessionKey/registerSessionKey.d.ts +8 -0
  106. package/src/lib/sessionKeys/registerSessionKey/registerSessionKey.js +42 -0
  107. package/src/lib/sessionKeys/removeSessionKey/index.d.ts +1 -0
  108. package/src/lib/sessionKeys/removeSessionKey/removeSessionKey.d.ts +1 -0
  109. package/src/lib/sessionKeys/removeSessionKey/removeSessionKey.js +9 -0
  110. package/src/lib/sessionKeys/toEncodedFormat/index.d.ts +1 -0
  111. package/src/lib/sessionKeys/toEncodedFormat/toEncodedFormat.d.ts +1 -0
  112. package/src/lib/sessionKeys/toEncodedFormat/toEncodedFormat.js +15 -0
  113. package/src/lib/sessionKeys/useRegisterEmbeddedWalletSessionKey/index.d.ts +1 -0
  114. package/src/lib/sessionKeys/useRegisterEmbeddedWalletSessionKey/useRegisterEmbeddedWalletSessionKey.d.ts +11 -0
  115. package/src/lib/sessionKeys/useRegisterEmbeddedWalletSessionKey/useRegisterEmbeddedWalletSessionKey.js +101 -0
  116. package/src/lib/sessionKeys/useSetTurnkeyConnectorFetchers/index.d.ts +1 -0
  117. package/src/lib/sessionKeys/useSetTurnkeyConnectorFetchers/useSetTurnkeyConnectorFetchers.d.ts +4 -0
  118. package/src/lib/sessionKeys/useSetTurnkeyConnectorFetchers/useSetTurnkeyConnectorFetchers.js +18 -0
  119. package/src/lib/softDeleteEmbeddedWallet/index.d.ts +1 -0
  120. package/src/lib/softDeleteEmbeddedWallet/softDeleteEmbeddedWallet.d.ts +5 -0
  121. package/src/lib/softDeleteEmbeddedWallet/softDeleteEmbeddedWallet.js +21 -0
  122. package/src/lib/ui/AccountUpgradedView/AccountUpgradedView.d.ts +5 -0
  123. package/src/lib/ui/AccountUpgradedView/AccountUpgradedView.js +44 -0
  124. package/src/lib/ui/AccountUpgradedView/index.d.ts +1 -0
  125. package/src/lib/ui/LegacyEmbeddedWalletExport/LegacyEmbeddedWalletExport.d.ts +6 -0
  126. package/src/lib/ui/LegacyEmbeddedWalletExport/LegacyEmbeddedWalletExport.js +122 -0
  127. package/src/lib/ui/LegacyEmbeddedWalletExport/index.d.ts +1 -0
  128. package/src/lib/ui/LegacyWalletExportSheet/LegacyWalletExportSheet.d.ts +17 -0
  129. package/src/lib/ui/LegacyWalletExportSheet/LegacyWalletExportSheet.js +60 -0
  130. package/src/lib/ui/LegacyWalletExportSheet/index.d.ts +1 -0
  131. package/src/lib/ui/LegacyWalletMigrationContext/LegacyWalletMigrationContext.d.ts +42 -0
  132. package/src/lib/ui/LegacyWalletMigrationContext/LegacyWalletMigrationContext.js +109 -0
  133. package/src/lib/ui/LegacyWalletMigrationContext/index.d.ts +1 -0
  134. package/src/lib/ui/LegacyWalletMigrationModal/LegacyWalletMigrationModal.d.ts +15 -0
  135. package/src/lib/ui/LegacyWalletMigrationModal/LegacyWalletMigrationModal.js +51 -0
  136. package/src/lib/ui/LegacyWalletMigrationModal/index.d.ts +1 -0
  137. package/src/lib/ui/LegacyWalletMigrationRecoveryContext/LegacyWalletMigrationRecoveryContext.d.ts +25 -0
  138. package/src/lib/ui/LegacyWalletMigrationRecoveryContext/LegacyWalletMigrationRecoveryContext.js +213 -0
  139. package/src/lib/ui/LegacyWalletMigrationRecoveryContext/index.d.ts +1 -0
  140. package/src/lib/ui/WaasUpgradeView/WaasUpgradeView.d.ts +9 -0
  141. package/src/lib/ui/WaasUpgradeView/WaasUpgradeView.js +62 -0
  142. package/src/lib/ui/WaasUpgradeView/index.d.ts +1 -0
  143. package/src/lib/ui/WalletUpgradeFlowView/WalletUpgradeFlowView.d.ts +12 -0
  144. package/src/lib/ui/WalletUpgradeFlowView/WalletUpgradeFlowView.js +124 -0
  145. package/src/lib/ui/WalletUpgradeFlowView/index.d.ts +1 -0
  146. package/src/lib/ui/recovery/LegacyAddRecoveryEmailView/LegacyAddRecoveryEmailView.d.ts +9 -0
  147. package/src/lib/ui/recovery/LegacyAddRecoveryEmailView/LegacyAddRecoveryEmailView.js +21 -0
  148. package/src/lib/ui/recovery/LegacyAddRecoveryEmailView/index.d.ts +1 -0
  149. package/src/lib/ui/recovery/LegacyEmbeddedAuthChoiceView/LegacyEmbeddedAuthChoiceView.d.ts +9 -0
  150. package/src/lib/ui/recovery/LegacyEmbeddedAuthChoiceView/LegacyEmbeddedAuthChoiceView.js +29 -0
  151. package/src/lib/ui/recovery/LegacyEmbeddedAuthChoiceView/index.d.ts +1 -0
  152. package/src/lib/ui/recovery/LegacyPasskeyBundleRecoveryView/LegacyPasskeyBundleRecoveryView.d.ts +10 -0
  153. package/src/lib/ui/recovery/LegacyPasskeyBundleRecoveryView/LegacyPasskeyBundleRecoveryView.js +36 -0
  154. package/src/lib/ui/recovery/LegacyPasskeyBundleRecoveryView/index.d.ts +1 -0
  155. package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/LegacyPasskeyCompleteRecoveryView.d.ts +8 -0
  156. package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/LegacyPasskeyCompleteRecoveryView.js +22 -0
  157. package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/index.d.ts +1 -0
  158. package/src/lib/ui/recovery/index.d.ts +4 -0
  159. package/src/lib/ui/useLegacyWalletExport/index.d.ts +1 -0
  160. package/src/lib/ui/useLegacyWalletExport/useLegacyWalletExport.d.ts +9 -0
  161. package/src/lib/ui/useLegacyWalletExport/useLegacyWalletExport.js +75 -0
  162. package/src/lib/upgradeToDynamicWaas/index.d.ts +1 -0
  163. package/src/lib/upgradeToDynamicWaas/upgradeToDynamicWaas.d.ts +13 -0
  164. package/src/lib/upgradeToDynamicWaas/upgradeToDynamicWaas.js +72 -0
  165. package/src/lib/useLegacyWalletsToMigrate/index.d.ts +2 -0
  166. package/src/lib/useLegacyWalletsToMigrate/useHasLegacyWalletsToMigrate.d.ts +6 -0
  167. package/src/lib/useLegacyWalletsToMigrate/useHasLegacyWalletsToMigrate.js +14 -0
  168. package/src/lib/useLegacyWalletsToMigrate/useLegacyWalletsToMigrate.d.ts +10 -0
  169. package/src/lib/useLegacyWalletsToMigrate/useLegacyWalletsToMigrate.js +32 -0
  170. package/src/lib/useUpgradeToDynamicWaas/index.d.ts +1 -0
  171. package/src/lib/useUpgradeToDynamicWaas/useUpgradeToDynamicWaas.d.ts +20 -0
  172. package/src/lib/useUpgradeToDynamicWaas/useUpgradeToDynamicWaas.js +44 -0
@@ -0,0 +1,197 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { useCallback } from 'react';
4
+ import { getDefaultClient, getCore, createApiClient, updateAuthFromVerifyResponse } from '@dynamic-labs-sdk/client/core';
5
+ import { WalletProviderEnum, NextViewEnum } from '@dynamic-labs/sdk-api-core';
6
+ import { logger, isPasskeyWalletConnector, isSessionKeyCompatibleWalletConnector } from '@dynamic-labs/wallet-connector-core';
7
+ import { addEmailRecovery } from '../addEmailRecovery/addEmailRecovery.js';
8
+ import { addNewPasskeyAuthenticator } from '../addNewPasskeyAuthenticator/addNewPasskeyAuthenticator.js';
9
+ import { canRestoreEmbeddedWalletSession } from '../canRestoreEmbeddedWalletSession/canRestoreEmbeddedWalletSession.js';
10
+ import { restoreEmbeddedWalletSession } from '../restoreEmbeddedWalletSession/restoreEmbeddedWalletSession.js';
11
+ import { iframeElementId } from '../constants.js';
12
+ import { useInitEmbeddedWalletAuthMethod } from '../useInitEmbeddedWalletAuthMethod/useInitEmbeddedWalletAuthMethod.js';
13
+
14
+ const sessionExpirationUnit = {
15
+ days: 86400,
16
+ hours: 3600,
17
+ minutes: 60,
18
+ };
19
+ const toSessionExpirationSeconds = (duration) => {
20
+ var _a, _b;
21
+ if (!duration)
22
+ return 0;
23
+ const amount = (_a = duration.amount) !== null && _a !== void 0 ? _a : 0;
24
+ const unit = (_b = sessionExpirationUnit[duration.unit]) !== null && _b !== void 0 ? _b : 0;
25
+ return amount * unit;
26
+ };
27
+ const enabledSecurityMethodKeys = (supportedSecurityMethods) => {
28
+ if (!supportedSecurityMethods)
29
+ return [];
30
+ return Object.keys(supportedSecurityMethods).filter((key) => { var _a; return (_a = supportedSecurityMethods[key]) === null || _a === void 0 ? void 0 : _a.isEnabled; });
31
+ };
32
+ const hasEmbeddedWalletCredential = (user) => {
33
+ var _a;
34
+ return Boolean((_a = user === null || user === void 0 ? void 0 : user.verifiedCredentials) === null || _a === void 0 ? void 0 : _a.some(({ walletProvider }) => walletProvider === WalletProviderEnum.EmbeddedWallet));
35
+ };
36
+ const usePasskeyRecovery = ({ user, wallet, primaryWallet, sessionKeyDuration, supportedSecurityMethods, isTurnkeyWalletWithoutAuthenticator, hasRecoveryEmail, iframeContainer, onShowAddRecoveryEmail, onShowAuthChoice, awaitEmailVerification, onShowEmailBundle, onAuthMethodComplete, onEmailRecoveryComplete, onEmailRecoveryFailed, }) => {
37
+ const sessionExpiration = toSessionExpirationSeconds(sessionKeyDuration);
38
+ const { initAuthMethod } = useInitEmbeddedWalletAuthMethod({
39
+ onComplete: onAuthMethodComplete,
40
+ onShowEmailBundle,
41
+ sessionExpiration,
42
+ user,
43
+ wallet,
44
+ });
45
+ const isSessionRestored = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
46
+ if (!sessionKeyDuration ||
47
+ !canRestoreEmbeddedWalletSession(sessionKeyDuration)) {
48
+ return false;
49
+ }
50
+ try {
51
+ return yield restoreEmbeddedWalletSession({
52
+ iframeContainer: iframeContainer,
53
+ iframeElementId,
54
+ sessionExpiration,
55
+ user,
56
+ wallet: primaryWallet,
57
+ });
58
+ }
59
+ catch (err) {
60
+ logger.error('Failed to restore embedded wallet', err);
61
+ }
62
+ return false;
63
+ }), [
64
+ user,
65
+ iframeContainer,
66
+ primaryWallet,
67
+ sessionKeyDuration,
68
+ sessionExpiration,
69
+ ]);
70
+ const shouldInitRecovery = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
71
+ if (!wallet || !isPasskeyWalletConnector(wallet.connector)) {
72
+ return false;
73
+ }
74
+ const turnkeyRecoveryHandler = wallet.connector.getAuthenticatorHandler();
75
+ // user has passkey authenticator set up OR
76
+ // email auth - session is still up, so no need to recover
77
+ if (!isTurnkeyWalletWithoutAuthenticator ||
78
+ turnkeyRecoveryHandler.isSessionActive() ||
79
+ (yield isSessionRestored())) {
80
+ return false;
81
+ }
82
+ // For v2 wallets that logged in via email: the session key fetcher is
83
+ // wired by LegacyWalletMigrationRecoveryProvider on mount. The export
84
+ // step (LegacyEmbeddedWalletExport) handles its own session creation
85
+ // via createOrRestoreSession + getTurnkeyClient in sequence, so we
86
+ // can skip recovery for any session-key-compatible connector — the
87
+ // export component will establish the session itself.
88
+ if (isSessionKeyCompatibleWalletConnector(wallet.connector)) {
89
+ return false;
90
+ }
91
+ return true;
92
+ }), [wallet, isTurnkeyWalletWithoutAuthenticator, isSessionRestored]);
93
+ const initPasskeyRecoveryProcess = useCallback((authenticatorType, currentAction) => __awaiter(void 0, void 0, void 0, function* () {
94
+ if (!user) {
95
+ throw new Error('User is not logged in');
96
+ }
97
+ if (!hasEmbeddedWalletCredential(user)) {
98
+ throw new Error('Dynamic embedded wallet not found');
99
+ }
100
+ if (wallet && !isPasskeyWalletConnector(wallet.connector)) {
101
+ throw new Error('Dynamic embedded wallet not found.');
102
+ }
103
+ const turnkeyRecoveryHandler = (wallet === null || wallet === void 0 ? void 0 : wallet.connector).getAuthenticatorHandler();
104
+ // email auth - session is still up, so create passkey authenticator using the same session
105
+ if (authenticatorType === 'passkey' &&
106
+ turnkeyRecoveryHandler.isSessionActive()) {
107
+ yield addNewPasskeyAuthenticator({ user, wallet });
108
+ onAuthMethodComplete();
109
+ return;
110
+ }
111
+ const supportedAuthenticatorMethods = enabledSecurityMethodKeys(supportedSecurityMethods);
112
+ if (!hasRecoveryEmail) {
113
+ onShowAddRecoveryEmail();
114
+ return;
115
+ }
116
+ if (!authenticatorType && supportedAuthenticatorMethods.length > 1) {
117
+ onShowAuthChoice(currentAction);
118
+ return;
119
+ }
120
+ const [authType] = supportedAuthenticatorMethods;
121
+ // Since we force authenticatorType = 'email' during transactions when no
122
+ // passkey is configured, make sure it's actually supported. Otherwise
123
+ // fall back to the first supported authenticator type from the list.
124
+ let nextAuthenticatorType = authenticatorType !== null && authenticatorType !== void 0 ? authenticatorType : authType;
125
+ if (authenticatorType &&
126
+ !supportedAuthenticatorMethods.includes(authenticatorType)) {
127
+ nextAuthenticatorType = authType;
128
+ }
129
+ yield initAuthMethod({
130
+ authenticatorType: nextAuthenticatorType,
131
+ currentAction,
132
+ iframeContainer: iframeContainer,
133
+ });
134
+ }), [
135
+ wallet,
136
+ supportedSecurityMethods,
137
+ hasRecoveryEmail,
138
+ user,
139
+ onShowAddRecoveryEmail,
140
+ onShowAuthChoice,
141
+ onAuthMethodComplete,
142
+ initAuthMethod,
143
+ iframeContainer,
144
+ ]);
145
+ const updateUserProfile = (emailInput) => __awaiter(void 0, void 0, void 0, function* () {
146
+ var _a;
147
+ try {
148
+ const client = getDefaultClient();
149
+ const core = getCore(client);
150
+ const apiClient = createApiClient({}, client);
151
+ const response = yield apiClient.updateSelf({
152
+ environmentId: core.environmentId,
153
+ userFields: { email: emailInput },
154
+ });
155
+ updateAuthFromVerifyResponse({ response }, client);
156
+ if (response.nextView === NextViewEnum.Done) {
157
+ return response.user;
158
+ }
159
+ const verified = yield awaitEmailVerification({
160
+ email: emailInput,
161
+ verificationUUID: (_a = response.emailVerification) === null || _a === void 0 ? void 0 : _a.verificationUUID,
162
+ });
163
+ if (!verified) {
164
+ throw new Error('Failed to verify email');
165
+ }
166
+ return response.user;
167
+ }
168
+ catch (err) {
169
+ logger.error('Failed to update user email', err);
170
+ throw err;
171
+ }
172
+ });
173
+ const addRecoveryEmail = (emailInput) => __awaiter(void 0, void 0, void 0, function* () {
174
+ try {
175
+ let updatedUser = user;
176
+ if (!(user === null || user === void 0 ? void 0 : user.email)) {
177
+ updatedUser = (yield updateUserProfile(emailInput));
178
+ }
179
+ yield addEmailRecovery({
180
+ user: updatedUser,
181
+ wallet: primaryWallet,
182
+ });
183
+ onEmailRecoveryComplete === null || onEmailRecoveryComplete === void 0 ? void 0 : onEmailRecoveryComplete();
184
+ }
185
+ catch (err) {
186
+ logger.error('Failed to add recovery email', err);
187
+ onEmailRecoveryFailed === null || onEmailRecoveryFailed === void 0 ? void 0 : onEmailRecoveryFailed(err);
188
+ }
189
+ });
190
+ return {
191
+ addRecoveryEmail,
192
+ initPasskeyRecoveryProcess,
193
+ shouldInitRecovery,
194
+ };
195
+ };
196
+
197
+ export { usePasskeyRecovery };
@@ -0,0 +1 @@
1
+ export { restoreEmbeddedWallet } from './restoreEmbeddedWallet';
@@ -0,0 +1,5 @@
1
+ type RestoreEmbeddedWalletProps = {
2
+ walletId: string;
3
+ };
4
+ export declare const restoreEmbeddedWallet: ({ walletId, }: RestoreEmbeddedWalletProps) => Promise<void>;
5
+ export {};
@@ -0,0 +1,21 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../_virtual/_tslib.js';
3
+ import { getDefaultClient, getCore, createApiClient } from '@dynamic-labs-sdk/client/core';
4
+ import { DynamicError } from '@dynamic-labs/utils';
5
+
6
+ const restoreEmbeddedWallet = (_a) => __awaiter(void 0, [_a], void 0, function* ({ walletId, }) {
7
+ const client = getDefaultClient();
8
+ const core = getCore(client);
9
+ const apiClient = createApiClient({}, client);
10
+ try {
11
+ yield apiClient.restoreEmbeddedWallet({
12
+ environmentId: core.environmentId,
13
+ walletId,
14
+ });
15
+ }
16
+ catch (e) {
17
+ throw new DynamicError('Error restoring embedded wallet', 'restore_embedded_wallet_failed');
18
+ }
19
+ });
20
+
21
+ export { restoreEmbeddedWallet };
@@ -0,0 +1 @@
1
+ export declare const base64urlDecode: (s?: string) => Uint8Array;
@@ -0,0 +1,12 @@
1
+ 'use client'
2
+ // Takes a base64url-encoded string (e.g. "nMueRPiAm51YXEjRtka8S_8Ura3HaqbmqDqMJCZmvkM")
3
+ // and returns the corresponding bytes as a Uint8Array.
4
+ const base64urlDecode = (s) => {
5
+ var _a;
6
+ // Go from base64url encoding to base64 encoding
7
+ const base64 = (_a = s === null || s === void 0 ? void 0 : s.replace(/-/g, '+').replace(/_/g, '/')) !== null && _a !== void 0 ? _a : '';
8
+ // Use `atob` to decode base64
9
+ return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
10
+ };
11
+
12
+ export { base64urlDecode };
@@ -0,0 +1 @@
1
+ export { base64urlDecode } from './base64urlDecode';
@@ -0,0 +1 @@
1
+ export declare const buf2hex: (buffer: ArrayBufferLike) => string;
@@ -0,0 +1,7 @@
1
+ 'use client'
2
+ // Converts an ArrayBuffer to a hex-encoded string
3
+ const buf2hex = (buffer) => [...new Uint8Array(buffer)]
4
+ .map((x) => x.toString(16).padStart(2, '0'))
5
+ .join('');
6
+
7
+ export { buf2hex };
@@ -0,0 +1 @@
1
+ export { buf2hex } from './buf2hex';
@@ -0,0 +1 @@
1
+ export declare const compressRawPublicKey: (rawPublicKey: ArrayBuffer) => ArrayBuffer;
@@ -0,0 +1,15 @@
1
+ 'use client'
2
+ // Accepts a public key array buffer and returns a buffer with the compressed
3
+ // version of the public key. Drops the y-coordinate and encodes its parity in
4
+ // the first byte.
5
+ const compressRawPublicKey = (rawPublicKey) => {
6
+ const rawPublicKeyBytes = new Uint8Array(rawPublicKey);
7
+ const len = rawPublicKeyBytes.byteLength;
8
+ // Drop the y coordinate
9
+ const compressedBytes = rawPublicKeyBytes.slice(0, (1 + len) >>> 1);
10
+ // Encode the parity of `y` in first bit
11
+ compressedBytes[0] = 0x2 | (rawPublicKeyBytes[len - 1] & 0x01);
12
+ return compressedBytes.buffer;
13
+ };
14
+
15
+ export { compressRawPublicKey };
@@ -0,0 +1 @@
1
+ export { compressRawPublicKey } from './compressRawPublicKey';
@@ -0,0 +1,7 @@
1
+ import { type SessionKey } from '../generateSessionKey';
2
+ /**
3
+ * Generates a new session key and persists it to storage. The key is *not*
4
+ * registered with the backend — that happens later when the connector first
5
+ * needs it.
6
+ */
7
+ export declare const generateAndSaveSessionKey: () => Promise<SessionKey>;
@@ -0,0 +1,19 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { StorageService } from '@dynamic-labs/utils';
4
+ import { SECURE_ENCLAVE_WALLET_SESSION_KEYS, SECURE_ENCLAVE_WALLET_SESSION_KEYS_STORAGE_OPTIONS } from '../../constants.js';
5
+ import { generateSessionKey } from '../generateSessionKey/generateSessionKey.js';
6
+ import { toEncodedFormat } from '../toEncodedFormat/toEncodedFormat.js';
7
+
8
+ /**
9
+ * Generates a new session key and persists it to storage. The key is *not*
10
+ * registered with the backend — that happens later when the connector first
11
+ * needs it.
12
+ */
13
+ const generateAndSaveSessionKey = () => __awaiter(void 0, void 0, void 0, function* () {
14
+ const newSessionKey = yield generateSessionKey();
15
+ StorageService.setItem(SECURE_ENCLAVE_WALLET_SESSION_KEYS, toEncodedFormat(newSessionKey.publicKey, newSessionKey.privateKey, newSessionKey.privateKeyJwk, newSessionKey.registered), SECURE_ENCLAVE_WALLET_SESSION_KEYS_STORAGE_OPTIONS);
16
+ return newSessionKey;
17
+ });
18
+
19
+ export { generateAndSaveSessionKey };
@@ -0,0 +1 @@
1
+ export { generateAndSaveSessionKey } from './generateAndSaveSessionKey';
@@ -0,0 +1,13 @@
1
+ export type SessionKey = {
2
+ publicKey: string;
3
+ privateKey: string;
4
+ privateKeyJwk: JsonWebKey;
5
+ registered: boolean;
6
+ expirationDate?: Date;
7
+ };
8
+ /**
9
+ * Generates a fresh ECDSA P-256 keypair shaped as a {@link SessionKey}.
10
+ * The key is *not* persisted to storage and is *not* registered with the
11
+ * backend — callers are responsible for both.
12
+ */
13
+ export declare const generateSessionKey: () => Promise<SessionKey>;
@@ -0,0 +1,20 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { p256Keygen } from '../p256Keygen/p256Keygen.js';
4
+
5
+ /**
6
+ * Generates a fresh ECDSA P-256 keypair shaped as a {@link SessionKey}.
7
+ * The key is *not* persisted to storage and is *not* registered with the
8
+ * backend — callers are responsible for both.
9
+ */
10
+ const generateSessionKey = () => __awaiter(void 0, void 0, void 0, function* () {
11
+ const { private: privateKey, public: publicKey, privateJwk, } = yield p256Keygen();
12
+ return {
13
+ privateKey,
14
+ privateKeyJwk: privateJwk,
15
+ publicKey,
16
+ registered: false,
17
+ };
18
+ });
19
+
20
+ export { generateSessionKey };
@@ -0,0 +1 @@
1
+ export { generateSessionKey, type SessionKey } from './generateSessionKey';
@@ -0,0 +1,2 @@
1
+ import type { SessionKey } from '../generateSessionKey';
2
+ export declare const getDecodedSessionKeys: () => SessionKey | undefined;
@@ -0,0 +1,28 @@
1
+ 'use client'
2
+ import { StorageService } from '@dynamic-labs/utils';
3
+ import { SECURE_ENCLAVE_WALLET_SESSION_KEYS, SECURE_ENCLAVE_WALLET_SESSION_KEYS_STORAGE_OPTIONS } from '../../constants.js';
4
+
5
+ const isSessionKey = (value) => {
6
+ if (!value || typeof value !== 'object')
7
+ return false;
8
+ const candidate = value;
9
+ return (typeof candidate.privateKey === 'string' &&
10
+ typeof candidate.publicKey === 'string' &&
11
+ typeof candidate.registered === 'boolean' &&
12
+ typeof candidate.privateKeyJwk === 'object' &&
13
+ candidate.privateKeyJwk !== null);
14
+ };
15
+ const getDecodedSessionKeys = () => {
16
+ const sessionKeysSS = StorageService.getItem(SECURE_ENCLAVE_WALLET_SESSION_KEYS, SECURE_ENCLAVE_WALLET_SESSION_KEYS_STORAGE_OPTIONS);
17
+ if (!sessionKeysSS)
18
+ return undefined;
19
+ try {
20
+ const parsed = JSON.parse(Buffer.from(sessionKeysSS, 'base64').toString());
21
+ return isSessionKey(parsed) ? parsed : undefined;
22
+ }
23
+ catch (_a) {
24
+ return undefined;
25
+ }
26
+ };
27
+
28
+ export { getDecodedSessionKeys };
@@ -0,0 +1 @@
1
+ export { getDecodedSessionKeys } from './getDecodedSessionKeys';
@@ -0,0 +1,6 @@
1
+ export type SessionNonceHeaders = {
2
+ nonce: string;
3
+ nonceSignature: string;
4
+ publicKey: string;
5
+ };
6
+ export declare const getSessionNonceHeaders: () => Promise<SessionNonceHeaders>;
@@ -0,0 +1,19 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { getDefaultClient, getSignedSessionId, getSessionKeys } from '@dynamic-labs-sdk/client/core';
4
+
5
+ const getSessionNonceHeaders = () => __awaiter(void 0, void 0, void 0, function* () {
6
+ var _a, _b;
7
+ const client = getDefaultClient();
8
+ const { signature } = yield getSignedSessionId(client);
9
+ // signature format: "${signedSessionId}/${nonceSignature}/${nonce}"
10
+ const parts = signature.split('/');
11
+ if (parts.length < 3) {
12
+ throw new Error(`Unexpected session chaining signature format: expected 3 parts, got ${parts.length}`);
13
+ }
14
+ const [, nonceSignature, nonce] = parts;
15
+ const publicKey = (_b = (_a = getSessionKeys(client)) === null || _a === void 0 ? void 0 : _a.publicKey) !== null && _b !== void 0 ? _b : '';
16
+ return { nonce, nonceSignature, publicKey };
17
+ });
18
+
19
+ export { getSessionNonceHeaders };
@@ -0,0 +1 @@
1
+ export { getSessionNonceHeaders, type SessionNonceHeaders, } from './getSessionNonceHeaders';
@@ -0,0 +1 @@
1
+ export { p256Keygen, type P256KeyPair } from './p256Keygen';
@@ -0,0 +1,11 @@
1
+ export type P256KeyPair = {
2
+ /** Hex-encoded raw private key — format used by the Turnkey API key stamper. */
3
+ private: string;
4
+ /** JWK private key — format required for signing chaining signatures. */
5
+ privateJwk: JsonWebKey;
6
+ /** Hex-encoded compressed public key. */
7
+ public: string;
8
+ /** Hex-encoded uncompressed public key. */
9
+ publicUncompressed: string;
10
+ };
11
+ export declare const p256Keygen: () => Promise<P256KeyPair>;
@@ -0,0 +1,26 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { base64urlDecode } from '../base64urlDecode/base64urlDecode.js';
4
+ import { buf2hex } from '../buf2hex/buf2hex.js';
5
+ import { compressRawPublicKey } from '../compressRawPublicKey/compressRawPublicKey.js';
6
+
7
+ const p256Keygen = () => __awaiter(void 0, void 0, void 0, function* () {
8
+ const p256Keypair = yield crypto.subtle.generateKey({
9
+ name: 'ECDSA',
10
+ namedCurve: 'P-256',
11
+ }, true, ['sign', 'verify']);
12
+ // Export the raw public key (uncompressed)
13
+ const rawPublicKey = yield crypto.subtle.exportKey('raw', p256Keypair.publicKey);
14
+ // Export private as JWK (raw export of EC private keys isn't supported)
15
+ const privateKeyJwk = yield crypto.subtle.exportKey('jwk', p256Keypair.privateKey);
16
+ const compressedPublicKeyBuffer = compressRawPublicKey(rawPublicKey);
17
+ const privateKeyBuffer = base64urlDecode(privateKeyJwk.d);
18
+ return {
19
+ private: buf2hex(privateKeyBuffer.buffer),
20
+ privateJwk: privateKeyJwk,
21
+ public: buf2hex(compressedPublicKeyBuffer),
22
+ publicUncompressed: buf2hex(rawPublicKey),
23
+ };
24
+ });
25
+
26
+ export { p256Keygen };
@@ -0,0 +1 @@
1
+ export { p256Sign } from './p256Sign';
@@ -0,0 +1 @@
1
+ export declare const p256Sign: (privateKeyJwk: JsonWebKey, message: string) => Promise<string>;
@@ -0,0 +1,17 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { buf2hex } from '../buf2hex/buf2hex.js';
4
+
5
+ const p256Sign = (privateKeyJwk, message) => __awaiter(void 0, void 0, void 0, function* () {
6
+ const privateKey = yield crypto.subtle.importKey('jwk', privateKeyJwk, {
7
+ name: 'ECDSA',
8
+ namedCurve: 'P-256',
9
+ }, false, ['sign']);
10
+ const signature = yield crypto.subtle.sign({
11
+ hash: 'SHA-256',
12
+ name: 'ECDSA',
13
+ }, privateKey, new TextEncoder().encode(message));
14
+ return buf2hex(signature);
15
+ });
16
+
17
+ export { p256Sign };
@@ -0,0 +1 @@
1
+ export { registerSessionKey } from './registerSessionKey';
@@ -0,0 +1,8 @@
1
+ import { RegisterEmbeddedWalletSessionKeyResponse } from '@dynamic-labs/sdk-api-core';
2
+ type RegisterSessionKeyProps = {
3
+ prevSessionKeySignature?: string;
4
+ publicKey: string;
5
+ walletId: string;
6
+ };
7
+ export declare const registerSessionKey: ({ prevSessionKeySignature, publicKey, walletId, }: RegisterSessionKeyProps) => Promise<RegisterEmbeddedWalletSessionKeyResponse>;
8
+ export {};
@@ -0,0 +1,42 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { getDefaultClient, getCore, createApiClient, APIError } from '@dynamic-labs-sdk/client/core';
4
+ import { UnprocessableEntityErrorCode } from '@dynamic-labs/sdk-api-core';
5
+ import { InvalidEmbeddedWalletSessionKeyError } from '@dynamic-labs/utils';
6
+ import { getSessionNonceHeaders } from '../getSessionNonceHeaders/getSessionNonceHeaders.js';
7
+
8
+ const SESSION_PUBLIC_KEY_HEADER = 'x-dyn-session-public-key';
9
+ const SESSION_NONCE_HEADER = 'x-dyn-session-nonce';
10
+ const SESSION_NONCE_SIGNATURE_HEADER = 'x-dyn-session-nonce-signature';
11
+ const registerSessionKey = (_a) => __awaiter(void 0, [_a], void 0, function* ({ prevSessionKeySignature, publicKey, walletId, }) {
12
+ const client = getDefaultClient();
13
+ const core = getCore(client);
14
+ try {
15
+ const { nonce, nonceSignature, publicKey: sessionPublicKey, } = yield getSessionNonceHeaders();
16
+ const apiClient = createApiClient({
17
+ headers: {
18
+ [SESSION_NONCE_HEADER]: nonce,
19
+ [SESSION_NONCE_SIGNATURE_HEADER]: nonceSignature,
20
+ [SESSION_PUBLIC_KEY_HEADER]: sessionPublicKey,
21
+ },
22
+ }, client);
23
+ return yield apiClient.registerSessionKey({
24
+ environmentId: core.environmentId,
25
+ registerSessionKeyRequest: {
26
+ prevSessionKeySignature,
27
+ publicKey,
28
+ walletId,
29
+ },
30
+ });
31
+ }
32
+ catch (error) {
33
+ if (error instanceof APIError &&
34
+ error.status === 422 &&
35
+ error.code === UnprocessableEntityErrorCode.InvalidSessionPublicKey) {
36
+ throw new InvalidEmbeddedWalletSessionKeyError(error.message);
37
+ }
38
+ throw error;
39
+ }
40
+ });
41
+
42
+ export { registerSessionKey };
@@ -0,0 +1 @@
1
+ export { removeSessionKey } from './removeSessionKey';
@@ -0,0 +1 @@
1
+ export declare const removeSessionKey: () => void;
@@ -0,0 +1,9 @@
1
+ 'use client'
2
+ import { StorageService } from '@dynamic-labs/utils';
3
+ import { SECURE_ENCLAVE_WALLET_SESSION_KEYS, SECURE_ENCLAVE_WALLET_SESSION_KEYS_STORAGE_OPTIONS } from '../../constants.js';
4
+
5
+ const removeSessionKey = () => {
6
+ StorageService.removeItem(SECURE_ENCLAVE_WALLET_SESSION_KEYS, SECURE_ENCLAVE_WALLET_SESSION_KEYS_STORAGE_OPTIONS);
7
+ };
8
+
9
+ export { removeSessionKey };
@@ -0,0 +1 @@
1
+ export { toEncodedFormat } from './toEncodedFormat';
@@ -0,0 +1 @@
1
+ export declare const toEncodedFormat: (publicKey: string, privateKey: string, privateKeyJwk: JsonWebKey, registered: boolean, expirationDate?: Date) => string;
@@ -0,0 +1,15 @@
1
+ 'use client'
2
+ // Encodes a session-key tuple as a base64-encoded JSON string for storage.
3
+ const toEncodedFormat = (publicKey, privateKey, privateKeyJwk, registered, expirationDate) => {
4
+ const sessionKeys = {
5
+ expirationDate,
6
+ privateKey,
7
+ privateKeyJwk,
8
+ publicKey,
9
+ registered,
10
+ };
11
+ const sessionKeysString = JSON.stringify(sessionKeys);
12
+ return Buffer.from(sessionKeysString).toString('base64');
13
+ };
14
+
15
+ export { toEncodedFormat };
@@ -0,0 +1 @@
1
+ export { useRegisterEmbeddedWalletSessionKey, type RegisterEmbeddedWalletSessionKeyArgs, type RegisterEmbeddedWalletSessionKeyResult, } from './useRegisterEmbeddedWalletSessionKey';
@@ -0,0 +1,11 @@
1
+ import { type SessionKey } from '../generateSessionKey';
2
+ export type RegisterEmbeddedWalletSessionKeyArgs = {
3
+ ignoreRestore?: boolean;
4
+ walletId: string;
5
+ };
6
+ export type RegisterEmbeddedWalletSessionKeyResult = {
7
+ expirationDate: Date;
8
+ privateKey: string;
9
+ publicKey: string;
10
+ };
11
+ export declare const useRegisterEmbeddedWalletSessionKey: () => ({ ignoreRestore, walletId, }: RegisterEmbeddedWalletSessionKeyArgs) => Promise<SessionKey | RegisterEmbeddedWalletSessionKeyResult>;