@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,36 @@
1
+ 'use client'
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { useState } from 'react';
4
+ import { useTranslation } from 'react-i18next';
5
+ import { IconButton, ModalHeader, Typography, Input, TypographyButton } from '@dynamic-labs/sdk-react-core/components';
6
+ import { CloseIcon } from '@dynamic-labs/sdk-react-core/icons';
7
+
8
+ const containerStyle = {
9
+ display: 'flex',
10
+ flexDirection: 'column',
11
+ gap: 24,
12
+ padding: 24,
13
+ };
14
+ // eslint-disable-next-line no-useless-escape
15
+ const bundleRegex = /^([A-Za-z0-9\s_+@\.-]+)$/;
16
+ const BUNDLE_MIN_LENGTH = 100;
17
+ const BUNDLE_MAX_LENGTH = 256;
18
+ const isValidBundle = (bundle) => bundle.length >= BUNDLE_MIN_LENGTH &&
19
+ bundle.length < BUNDLE_MAX_LENGTH &&
20
+ bundleRegex.test(bundle);
21
+ const LegacyPasskeyBundleRecoveryView = ({ email, onSubmit, onResend, onCancel, isSubmitting, errorMessage }) => {
22
+ const { t } = useTranslation();
23
+ const [bundleInput, setBundleInput] = useState('');
24
+ const closeButton = (jsx(IconButton, { onClick: onCancel, type: 'button', children: jsx(CloseIcon, {}) }));
25
+ const handleBundleChange = (event) => {
26
+ const next = event.target.value.trim();
27
+ setBundleInput(next);
28
+ if (isValidBundle(next)) {
29
+ onSubmit(next);
30
+ }
31
+ };
32
+ const resendDisabled = Boolean(isSubmitting) || (bundleInput.length > 0 && !errorMessage);
33
+ return (jsxs(Fragment, { children: [jsx(ModalHeader, { trailing: closeButton, children: jsx(Typography, { variant: 'title', color: 'primary', children: t('dyn_passkey_recovery.code.title') }) }), jsxs("div", { style: containerStyle, children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', children: t('dyn_passkey_recovery.code.description', { email: email !== null && email !== void 0 ? email : '' }) }), jsx(Input, { id: 'legacy-passkey-recovery-bundle', "data-testid": 'legacy-passkey-bundle-input', value: bundleInput, onChange: handleBundleChange, label: t('dyn_passkey_recovery.code.input_label'), disabled: isSubmitting, error: Boolean(errorMessage), message: errorMessage, autoFocus: true }), jsx(TypographyButton, { dataTestId: 'legacy-passkey-bundle-resend', onClick: () => onResend(), buttonVariant: 'primary', expanded: true, disabled: resendDisabled, children: t('dyn_passkey_recovery.code.resend.button') })] })] }));
34
+ };
35
+
36
+ export { LegacyPasskeyBundleRecoveryView };
@@ -0,0 +1 @@
1
+ export { LegacyPasskeyBundleRecoveryView, type LegacyPasskeyBundleRecoveryViewProps, } from './LegacyPasskeyBundleRecoveryView';
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ export type LegacyPasskeyCompleteRecoveryViewProps = {
3
+ onSubmit: () => Promise<void> | void;
4
+ onCancel: () => void;
5
+ isSubmitting?: boolean;
6
+ errorMessage?: string;
7
+ };
8
+ export declare const LegacyPasskeyCompleteRecoveryView: FC<LegacyPasskeyCompleteRecoveryViewProps>;
@@ -0,0 +1,22 @@
1
+ 'use client'
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { IconButton, ModalHeader, Typography, TypographyButton } from '@dynamic-labs/sdk-react-core/components';
5
+ import { CloseIcon } from '@dynamic-labs/sdk-react-core/icons';
6
+
7
+ const containerStyle = {
8
+ display: 'flex',
9
+ flexDirection: 'column',
10
+ gap: 24,
11
+ padding: 24,
12
+ };
13
+ // Stub — the WebAuthn-attestation prompt is wired in PR C.2 alongside the
14
+ // usePasskeyRecovery hook integration. For now this view exposes the modal
15
+ // header + submit hook so the step machine can be exercised.
16
+ const LegacyPasskeyCompleteRecoveryView = ({ onSubmit, onCancel, isSubmitting, errorMessage }) => {
17
+ const { t } = useTranslation();
18
+ const closeButton = (jsx(IconButton, { onClick: onCancel, type: 'button', children: jsx(CloseIcon, {}) }));
19
+ return (jsxs(Fragment, { children: [jsx(ModalHeader, { trailing: closeButton, children: jsx(Typography, { variant: 'title', color: 'primary', children: t('dyn_passkey_recovery.complete.title') }) }), jsxs("div", { style: containerStyle, children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', children: t('dyn_passkey_recovery.complete.description') }), errorMessage && (jsx(Typography, { variant: 'body_small', color: 'error-1', children: errorMessage })), jsx(TypographyButton, { dataTestId: 'legacy-passkey-complete-submit', onClick: () => onSubmit(), buttonVariant: 'brand-primary', expanded: true, disabled: isSubmitting, typographyProps: { color: 'white' }, children: t('dyn_passkey_recovery.complete.complete_button') })] })] }));
20
+ };
21
+
22
+ export { LegacyPasskeyCompleteRecoveryView };
@@ -0,0 +1 @@
1
+ export { LegacyPasskeyCompleteRecoveryView, type LegacyPasskeyCompleteRecoveryViewProps, } from './LegacyPasskeyCompleteRecoveryView';
@@ -0,0 +1,4 @@
1
+ export { LegacyAddRecoveryEmailView, type LegacyAddRecoveryEmailViewProps, } from './LegacyAddRecoveryEmailView';
2
+ export { LegacyPasskeyBundleRecoveryView, type LegacyPasskeyBundleRecoveryViewProps, } from './LegacyPasskeyBundleRecoveryView';
3
+ export { LegacyPasskeyCompleteRecoveryView, type LegacyPasskeyCompleteRecoveryViewProps, } from './LegacyPasskeyCompleteRecoveryView';
4
+ export { LegacyEmbeddedAuthChoiceView, type LegacyEmbeddedAuthChoiceViewProps, } from './LegacyEmbeddedAuthChoiceView';
@@ -0,0 +1 @@
1
+ export { useLegacyWalletExport, type RevealLegacyWalletKeyParams, } from './useLegacyWalletExport';
@@ -0,0 +1,9 @@
1
+ import { Wallet, WalletConnectorCore } from '@dynamic-labs/wallet-connector-core';
2
+ export type RevealLegacyWalletKeyParams = {
3
+ type?: 'privateKey' | 'recoveryPhrase';
4
+ htmlContainerId?: string;
5
+ wallet?: Wallet<WalletConnectorCore.WalletConnector>;
6
+ };
7
+ export declare const useLegacyWalletExport: () => {
8
+ readonly revealWalletKey: (params?: RevealLegacyWalletKeyParams) => Promise<boolean>;
9
+ };
@@ -0,0 +1,75 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../_virtual/_tslib.js';
3
+ import { useRef, useCallback } from 'react';
4
+ import { useDynamicContext } from '@dynamic-labs/sdk-react-core';
5
+ import { isSessionKeyCompatibleWalletConnector, isTurnkeyWalletConnector } from '@dynamic-labs/wallet-connector-core';
6
+ import { iframeContainerId, iframeElementId } from '../../constants.js';
7
+ import { cleanupExport } from '../../export/cleanupExport/cleanupExport.js';
8
+ import { exportTurnkeyWalletCredential } from '../../export/exportTurnkeyWalletCredential/exportTurnkeyWalletCredential.js';
9
+ import { initExport } from '../../export/initExport/initExport.js';
10
+ import { useSetTurnkeyConnectorFetchers } from '../../sessionKeys/useSetTurnkeyConnectorFetchers/useSetTurnkeyConnectorFetchers.js';
11
+ import { useLegacyWalletsToMigrate } from '../../useLegacyWalletsToMigrate/useLegacyWalletsToMigrate.js';
12
+
13
+ const createOrFindContainer = (elementId, parentElementId) => {
14
+ const existing = document.getElementById(elementId);
15
+ if (existing)
16
+ return existing;
17
+ const container = document.createElement('div');
18
+ container.setAttribute('id', elementId);
19
+ container.setAttribute('data-testid', elementId);
20
+ container.style.pointerEvents = 'auto';
21
+ const parent = parentElementId
22
+ ? document.getElementById(parentElementId)
23
+ : undefined;
24
+ if (parent) {
25
+ parent.appendChild(container);
26
+ }
27
+ else {
28
+ document.body.appendChild(container);
29
+ }
30
+ return container;
31
+ };
32
+ const useLegacyWalletExport = () => {
33
+ var _a;
34
+ const { user } = useDynamicContext();
35
+ const legacyWallets = useLegacyWalletsToMigrate();
36
+ const firstWallet = (_a = legacyWallets[0]) !== null && _a !== void 0 ? _a : null;
37
+ const setTurnkeyConnectorFetchers = useSetTurnkeyConnectorFetchers({
38
+ wallet: firstWallet,
39
+ });
40
+ const userRef = useRef(user);
41
+ userRef.current = user;
42
+ const revealWalletKey = useCallback((params) => __awaiter(void 0, void 0, void 0, function* () {
43
+ var _b, _c;
44
+ const wallet = (_b = params === null || params === void 0 ? void 0 : params.wallet) !== null && _b !== void 0 ? _b : firstWallet;
45
+ if (!wallet) {
46
+ throw new Error('No legacy Turnkey wallet available for export');
47
+ }
48
+ yield cleanupExport({ wallet });
49
+ const iframeContainer = createOrFindContainer(iframeContainerId, params === null || params === void 0 ? void 0 : params.htmlContainerId);
50
+ iframeContainer.style.display = 'none';
51
+ setTurnkeyConnectorFetchers();
52
+ if (isSessionKeyCompatibleWalletConnector(wallet.connector)) {
53
+ yield wallet.connector.createOrRestoreSession();
54
+ }
55
+ if (isTurnkeyWalletConnector(wallet.connector)) {
56
+ yield wallet.connector.getTurnkeyClient();
57
+ }
58
+ (_c = iframeContainer.querySelector(`#${iframeElementId}`)) === null || _c === void 0 ? void 0 : _c.remove();
59
+ yield initExport({
60
+ iframeContainer,
61
+ iframeElementId,
62
+ wallet,
63
+ });
64
+ yield exportTurnkeyWalletCredential({
65
+ exportPrivateKey: (params === null || params === void 0 ? void 0 : params.type) !== 'recoveryPhrase',
66
+ user: userRef.current,
67
+ wallet,
68
+ });
69
+ iframeContainer.style.display = 'block';
70
+ return true;
71
+ }), [firstWallet, setTurnkeyConnectorFetchers]);
72
+ return { revealWalletKey };
73
+ };
74
+
75
+ export { useLegacyWalletExport };
@@ -0,0 +1 @@
1
+ export { upgradeToDynamicWaas } from './upgradeToDynamicWaas';
@@ -0,0 +1,13 @@
1
+ import { ChainEnum } from '@dynamic-labs/sdk-api-core';
2
+ import { IDynamicWaasConnector } from '@dynamic-labs/wallet-connector-core';
3
+ type UpgradeToDynamicWaasProps = {
4
+ walletId: string;
5
+ chainName: ChainEnum;
6
+ privateKey: string;
7
+ password?: string;
8
+ publicAddressCheck?: string;
9
+ walletConnector: IDynamicWaasConnector;
10
+ onRestore: () => Promise<unknown> | unknown;
11
+ };
12
+ export declare const upgradeToDynamicWaas: ({ walletId, chainName, privateKey, password, publicAddressCheck, walletConnector, onRestore, }: UpgradeToDynamicWaasProps) => Promise<void>;
13
+ export {};
@@ -0,0 +1,72 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../_virtual/_tslib.js';
3
+ import { DynamicError } from '@dynamic-labs/utils';
4
+ import { logger } from '@dynamic-labs/wallet-connector-core';
5
+ import { restoreEmbeddedWallet } from '../restoreEmbeddedWallet/restoreEmbeddedWallet.js';
6
+ import { softDeleteEmbeddedWallet } from '../softDeleteEmbeddedWallet/softDeleteEmbeddedWallet.js';
7
+
8
+ const ZERODEV_SUFFIX = '-zerodev';
9
+ const PUBLIC_ADDRESS_MISMATCH = 'Public address mismatch';
10
+ const upgradeToDynamicWaas = (_a) => __awaiter(void 0, [_a], void 0, function* ({ walletId, chainName, privateKey, password, publicAddressCheck, walletConnector, onRestore, }) {
11
+ // Guard before any destructive work: an empty/whitespace private key
12
+ // would otherwise soft-delete the legacy wallet and only fail on import.
13
+ if (!(privateKey === null || privateKey === void 0 ? void 0 : privateKey.trim())) {
14
+ throw new DynamicError('Private key is required', 'private_key_is_required');
15
+ }
16
+ // 7702 wallets have a -zerodev suffix because it's a credential created on the fly
17
+ const normalizedWalletId = walletId.replace(ZERODEV_SUFFIX, '');
18
+ let softDeleteSucceeded = false;
19
+ logger.debug('Upgrade to WaaS - migration started', {
20
+ chain: chainName,
21
+ key: 'upgradeToWaasStarted',
22
+ walletId: normalizedWalletId,
23
+ });
24
+ try {
25
+ yield softDeleteEmbeddedWallet({ walletId: normalizedWalletId });
26
+ softDeleteSucceeded = true;
27
+ logger.debug('Upgrade to WaaS - legacy wallet soft deleted', {
28
+ chain: chainName,
29
+ key: 'upgradeToWaasSoftDeleted',
30
+ walletId: normalizedWalletId,
31
+ });
32
+ yield walletConnector.importPrivateKey({
33
+ chainName,
34
+ legacyWalletId: normalizedWalletId,
35
+ password,
36
+ privateKey,
37
+ publicAddressCheck,
38
+ });
39
+ logger.info('Upgrade to WaaS - migration completed', {
40
+ chain: chainName,
41
+ key: 'upgradeToWaasCompleted',
42
+ walletId: normalizedWalletId,
43
+ });
44
+ }
45
+ catch (error) {
46
+ logger.error('Upgrade to WaaS - migration failed', {
47
+ chain: chainName,
48
+ error,
49
+ softDeleteSucceeded,
50
+ walletId: normalizedWalletId,
51
+ });
52
+ if (softDeleteSucceeded) {
53
+ logger.debug('Upgrade to WaaS - restoring legacy wallet after failed import', {
54
+ chain: chainName,
55
+ key: 'upgradeToWaasRestore',
56
+ walletId: normalizedWalletId,
57
+ });
58
+ yield restoreEmbeddedWallet({ walletId: normalizedWalletId });
59
+ yield onRestore();
60
+ }
61
+ if (error instanceof DynamicError) {
62
+ throw error;
63
+ }
64
+ const errorMessage = (error === null || error === void 0 ? void 0 : error.message) || '';
65
+ if (errorMessage.includes(PUBLIC_ADDRESS_MISMATCH)) {
66
+ throw new DynamicError('Public address mismatch. Ensure the private key is copied correctly.', 'public_address_mismatch');
67
+ }
68
+ throw new DynamicError('Upgrade failed, please try again.', 'upgrade_failed');
69
+ }
70
+ });
71
+
72
+ export { upgradeToDynamicWaas };
@@ -0,0 +1,2 @@
1
+ export { useHasLegacyWalletsToMigrate } from './useHasLegacyWalletsToMigrate';
2
+ export { useLegacyWalletsToMigrate } from './useLegacyWalletsToMigrate';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Returns `true` if the current user has any legacy V1/V2 Turnkey wallets
3
+ * that need to be migrated to V3 WaaS. Convenience wrapper around
4
+ * `useLegacyWalletsToMigrate()`.
5
+ */
6
+ export declare const useHasLegacyWalletsToMigrate: () => boolean;
@@ -0,0 +1,14 @@
1
+ 'use client'
2
+ import { useLegacyWalletsToMigrate } from './useLegacyWalletsToMigrate.js';
3
+
4
+ /**
5
+ * Returns `true` if the current user has any legacy V1/V2 Turnkey wallets
6
+ * that need to be migrated to V3 WaaS. Convenience wrapper around
7
+ * `useLegacyWalletsToMigrate()`.
8
+ */
9
+ const useHasLegacyWalletsToMigrate = () => {
10
+ const wallets = useLegacyWalletsToMigrate();
11
+ return wallets.length > 0;
12
+ };
13
+
14
+ export { useHasLegacyWalletsToMigrate };
@@ -0,0 +1,10 @@
1
+ import { Wallet, WalletConnectorCore } from '@dynamic-labs/wallet-connector-core';
2
+ /**
3
+ * Returns the list of legacy V1/V2 Turnkey wallets on the current user that
4
+ * need to be migrated to V3 WaaS. Returns an empty array if there are none.
5
+ *
6
+ * Useful when you're building your own migration UI (headless mode) — wire
7
+ * the returned wallets through `useUpgradeToDynamicWaas` to perform the
8
+ * upgrade.
9
+ */
10
+ export declare const useLegacyWalletsToMigrate: () => Wallet<WalletConnectorCore.WalletConnector>[];
@@ -0,0 +1,32 @@
1
+ 'use client'
2
+ import { useMemo } from 'react';
3
+ import { useUserWallets, useSmartWallets } from '@dynamic-labs/sdk-react-core';
4
+
5
+ const isLegacyWallet = (wallet) => Boolean(wallet === null || wallet === void 0 ? void 0 : wallet.connector.key.startsWith('turnkey'));
6
+ /**
7
+ * Returns the list of legacy V1/V2 Turnkey wallets on the current user that
8
+ * need to be migrated to V3 WaaS. Returns an empty array if there are none.
9
+ *
10
+ * Useful when you're building your own migration UI (headless mode) — wire
11
+ * the returned wallets through `useUpgradeToDynamicWaas` to perform the
12
+ * upgrade.
13
+ */
14
+ const useLegacyWalletsToMigrate = () => {
15
+ const userWallets = useUserWallets();
16
+ const { getEOAWallet } = useSmartWallets();
17
+ return useMemo(() => {
18
+ const legacyWallets = new Map();
19
+ (userWallets !== null && userWallets !== void 0 ? userWallets : []).forEach((wallet) => {
20
+ if (isLegacyWallet(wallet)) {
21
+ legacyWallets.set(wallet.id, wallet);
22
+ }
23
+ const eoaWallet = getEOAWallet(wallet);
24
+ if (isLegacyWallet(eoaWallet)) {
25
+ legacyWallets.set(eoaWallet.id, eoaWallet);
26
+ }
27
+ });
28
+ return Array.from(legacyWallets.values());
29
+ }, [getEOAWallet, userWallets]);
30
+ };
31
+
32
+ export { useLegacyWalletsToMigrate };
@@ -0,0 +1 @@
1
+ export { useUpgradeToDynamicWaas } from './useUpgradeToDynamicWaas';
@@ -0,0 +1,20 @@
1
+ /// <reference types="react" />
2
+ import { Wallet, WalletConnectorCore } from '@dynamic-labs/wallet-connector-core';
3
+ type UpgradeToDynamicWaasArgs = {
4
+ privateKey: string;
5
+ wallet: Wallet<WalletConnectorCore.WalletConnector>;
6
+ password?: string;
7
+ };
8
+ type UseUpgradeToDynamicWaasProps = {
9
+ /**
10
+ * Called when the upgrade fails *after* the legacy wallet has been
11
+ * soft-deleted, to restore client-side auth state. Defaults to
12
+ * `useRefreshAuth()` — override only if you need custom rollback behavior.
13
+ */
14
+ onRestore?: () => Promise<unknown> | unknown;
15
+ };
16
+ export declare const useUpgradeToDynamicWaas: (props?: UseUpgradeToDynamicWaasProps) => {
17
+ isUpgrading: import("react").MutableRefObject<boolean>;
18
+ upgradeToDynamicWaas: ({ privateKey, wallet, password }: UpgradeToDynamicWaasArgs) => Promise<void>;
19
+ };
20
+ export {};
@@ -0,0 +1,44 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../_virtual/_tslib.js';
3
+ import { useRef, useCallback } from 'react';
4
+ import { useDynamicWaas, useRefreshAuth } from '@dynamic-labs/sdk-react-core';
5
+ import { DynamicError } from '@dynamic-labs/utils';
6
+ import { upgradeToDynamicWaas } from '../upgradeToDynamicWaas/upgradeToDynamicWaas.js';
7
+
8
+ const useUpgradeToDynamicWaas = (props = {}) => {
9
+ var _a;
10
+ const { getWaasWalletConnector } = useDynamicWaas();
11
+ const refreshAuth = useRefreshAuth();
12
+ const onRestore = (_a = props.onRestore) !== null && _a !== void 0 ? _a : refreshAuth;
13
+ const isUpgrading = useRef(false);
14
+ const upgrade = useCallback((_b) => __awaiter(void 0, [_b], void 0, function* ({ privateKey, wallet, password }) {
15
+ isUpgrading.current = true;
16
+ try {
17
+ const chainName = wallet.chain;
18
+ const walletConnector = getWaasWalletConnector(chainName);
19
+ if (!walletConnector) {
20
+ throw new DynamicError('Wallet connector not found', 'wallet_connector_not_found');
21
+ }
22
+ yield upgradeToDynamicWaas({
23
+ chainName,
24
+ onRestore,
25
+ password,
26
+ privateKey,
27
+ publicAddressCheck: wallet.address,
28
+ walletConnector,
29
+ walletId: wallet.id,
30
+ });
31
+ // The legacy wallet is now soft-deleted server-side and a fresh WaaS
32
+ // wallet has taken its place — refresh client-side auth so consumers
33
+ // (e.g. `useUserWallets`) see the new state instead of the stale
34
+ // Turnkey entry.
35
+ yield refreshAuth();
36
+ }
37
+ finally {
38
+ isUpgrading.current = false;
39
+ }
40
+ }), [getWaasWalletConnector, onRestore, refreshAuth]);
41
+ return { isUpgrading, upgradeToDynamicWaas: upgrade };
42
+ };
43
+
44
+ export { useUpgradeToDynamicWaas };