@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.
- package/CHANGELOG.md +6718 -0
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/_virtual/_tslib.js +32 -0
- package/package.js +4 -0
- package/package.json +31 -1
- package/src/index.d.ts +11 -0
- package/src/index.js +16 -0
- package/src/lib/constants.d.ts +8 -0
- package/src/lib/constants.js +12 -0
- package/src/lib/export/cleanupExport/cleanupExport.d.ts +4 -0
- package/src/lib/export/cleanupExport/cleanupExport.js +11 -0
- package/src/lib/export/cleanupExport/index.d.ts +1 -0
- package/src/lib/export/exportCredential/exportCredential.d.ts +7 -0
- package/src/lib/export/exportCredential/exportCredential.js +63 -0
- package/src/lib/export/exportCredential/index.d.ts +1 -0
- package/src/lib/export/exportEmbeddedWallet/exportEmbeddedWallet.d.ts +7 -0
- package/src/lib/export/exportEmbeddedWallet/exportEmbeddedWallet.js +21 -0
- package/src/lib/export/exportEmbeddedWallet/index.d.ts +1 -0
- package/src/lib/export/exportTurnkeyWalletCredential/exportTurnkeyWalletCredential.d.ts +9 -0
- package/src/lib/export/exportTurnkeyWalletCredential/exportTurnkeyWalletCredential.js +30 -0
- package/src/lib/export/exportTurnkeyWalletCredential/index.d.ts +1 -0
- package/src/lib/export/extractExportBundle/extractExportBundle.d.ts +5 -0
- package/src/lib/export/extractExportBundle/extractExportBundle.js +13 -0
- package/src/lib/export/extractExportBundle/index.d.ts +1 -0
- package/src/lib/export/handleExportInitCheck/handleExportInitCheck.d.ts +12 -0
- package/src/lib/export/handleExportInitCheck/handleExportInitCheck.js +34 -0
- package/src/lib/export/handleExportInitCheck/index.d.ts +1 -0
- package/src/lib/export/initExport/index.d.ts +1 -0
- package/src/lib/export/initExport/initExport.d.ts +6 -0
- package/src/lib/export/initExport/initExport.js +22 -0
- package/src/lib/getTurnkeyWalletId/getTurnkeyWalletId.d.ts +8 -0
- package/src/lib/getTurnkeyWalletId/getTurnkeyWalletId.js +27 -0
- package/src/lib/getTurnkeyWalletId/index.d.ts +1 -0
- package/src/lib/recovery/addEmailRecovery/addEmailRecovery.d.ts +7 -0
- package/src/lib/recovery/addEmailRecovery/addEmailRecovery.js +50 -0
- package/src/lib/recovery/addEmailRecovery/index.d.ts +1 -0
- package/src/lib/recovery/addNewPasskeyAuthenticator/addNewPasskeyAuthenticator.d.ts +7 -0
- package/src/lib/recovery/addNewPasskeyAuthenticator/addNewPasskeyAuthenticator.js +14 -0
- package/src/lib/recovery/addNewPasskeyAuthenticator/index.d.ts +1 -0
- package/src/lib/recovery/canRestoreEmbeddedWalletSession/canRestoreEmbeddedWalletSession.d.ts +2 -0
- package/src/lib/recovery/canRestoreEmbeddedWalletSession/canRestoreEmbeddedWalletSession.js +24 -0
- package/src/lib/recovery/canRestoreEmbeddedWalletSession/index.d.ts +1 -0
- package/src/lib/recovery/completePasskeyRecovery/completePasskeyRecovery.d.ts +7 -0
- package/src/lib/recovery/completePasskeyRecovery/completePasskeyRecovery.js +26 -0
- package/src/lib/recovery/completePasskeyRecovery/index.d.ts +1 -0
- package/src/lib/recovery/constants.d.ts +3 -0
- package/src/lib/recovery/constants.js +14 -0
- package/src/lib/recovery/index.d.ts +13 -0
- package/src/lib/recovery/initEmbeddedWalletSession/index.d.ts +1 -0
- package/src/lib/recovery/initEmbeddedWalletSession/initEmbeddedWalletSession.d.ts +11 -0
- package/src/lib/recovery/initEmbeddedWalletSession/initEmbeddedWalletSession.js +56 -0
- package/src/lib/recovery/passkeyRecoveryBundleValidation/index.d.ts +1 -0
- package/src/lib/recovery/passkeyRecoveryBundleValidation/passkeyRecoveryBundleValidation.d.ts +7 -0
- package/src/lib/recovery/passkeyRecoveryBundleValidation/passkeyRecoveryBundleValidation.js +32 -0
- package/src/lib/recovery/recoverTurnkeyWallet/index.d.ts +1 -0
- package/src/lib/recovery/recoverTurnkeyWallet/recoverTurnkeyWallet.d.ts +11 -0
- package/src/lib/recovery/recoverTurnkeyWallet/recoverTurnkeyWallet.js +72 -0
- package/src/lib/recovery/resentRecoveryEmail/index.d.ts +1 -0
- package/src/lib/recovery/resentRecoveryEmail/resentRecoveryEmail.d.ts +7 -0
- package/src/lib/recovery/resentRecoveryEmail/resentRecoveryEmail.js +43 -0
- package/src/lib/recovery/restoreEmbeddedWalletSession/index.d.ts +1 -0
- package/src/lib/recovery/restoreEmbeddedWalletSession/restoreEmbeddedWalletSession.d.ts +9 -0
- package/src/lib/recovery/restoreEmbeddedWalletSession/restoreEmbeddedWalletSession.js +33 -0
- package/src/lib/recovery/types.d.ts +5 -0
- package/src/lib/recovery/useEmbeddedWalletAuthenticator/index.d.ts +1 -0
- package/src/lib/recovery/useEmbeddedWalletAuthenticator/useEmbeddedWalletAuthenticator.d.ts +11 -0
- package/src/lib/recovery/useInitEmbeddedWalletAuthMethod/index.d.ts +1 -0
- package/src/lib/recovery/useInitEmbeddedWalletAuthMethod/useInitEmbeddedWalletAuthMethod.d.ts +29 -0
- package/src/lib/recovery/useInitEmbeddedWalletAuthMethod/useInitEmbeddedWalletAuthMethod.js +50 -0
- package/src/lib/recovery/usePasskeyRecovery/index.d.ts +1 -0
- package/src/lib/recovery/usePasskeyRecovery/usePasskeyRecovery.d.ts +32 -0
- package/src/lib/recovery/usePasskeyRecovery/usePasskeyRecovery.js +197 -0
- package/src/lib/restoreEmbeddedWallet/index.d.ts +1 -0
- package/src/lib/restoreEmbeddedWallet/restoreEmbeddedWallet.d.ts +5 -0
- package/src/lib/restoreEmbeddedWallet/restoreEmbeddedWallet.js +21 -0
- package/src/lib/sessionKeys/base64urlDecode/base64urlDecode.d.ts +1 -0
- package/src/lib/sessionKeys/base64urlDecode/base64urlDecode.js +12 -0
- package/src/lib/sessionKeys/base64urlDecode/index.d.ts +1 -0
- package/src/lib/sessionKeys/buf2hex/buf2hex.d.ts +1 -0
- package/src/lib/sessionKeys/buf2hex/buf2hex.js +7 -0
- package/src/lib/sessionKeys/buf2hex/index.d.ts +1 -0
- package/src/lib/sessionKeys/compressRawPublicKey/compressRawPublicKey.d.ts +1 -0
- package/src/lib/sessionKeys/compressRawPublicKey/compressRawPublicKey.js +15 -0
- package/src/lib/sessionKeys/compressRawPublicKey/index.d.ts +1 -0
- package/src/lib/sessionKeys/generateAndSaveSessionKey/generateAndSaveSessionKey.d.ts +7 -0
- package/src/lib/sessionKeys/generateAndSaveSessionKey/generateAndSaveSessionKey.js +19 -0
- package/src/lib/sessionKeys/generateAndSaveSessionKey/index.d.ts +1 -0
- package/src/lib/sessionKeys/generateSessionKey/generateSessionKey.d.ts +13 -0
- package/src/lib/sessionKeys/generateSessionKey/generateSessionKey.js +20 -0
- package/src/lib/sessionKeys/generateSessionKey/index.d.ts +1 -0
- package/src/lib/sessionKeys/getDecodedSessionKeys/getDecodedSessionKeys.d.ts +2 -0
- package/src/lib/sessionKeys/getDecodedSessionKeys/getDecodedSessionKeys.js +28 -0
- package/src/lib/sessionKeys/getDecodedSessionKeys/index.d.ts +1 -0
- package/src/lib/sessionKeys/getSessionNonceHeaders/getSessionNonceHeaders.d.ts +6 -0
- package/src/lib/sessionKeys/getSessionNonceHeaders/getSessionNonceHeaders.js +19 -0
- package/src/lib/sessionKeys/getSessionNonceHeaders/index.d.ts +1 -0
- package/src/lib/sessionKeys/p256Keygen/index.d.ts +1 -0
- package/src/lib/sessionKeys/p256Keygen/p256Keygen.d.ts +11 -0
- package/src/lib/sessionKeys/p256Keygen/p256Keygen.js +26 -0
- package/src/lib/sessionKeys/p256Sign/index.d.ts +1 -0
- package/src/lib/sessionKeys/p256Sign/p256Sign.d.ts +1 -0
- package/src/lib/sessionKeys/p256Sign/p256Sign.js +17 -0
- package/src/lib/sessionKeys/registerSessionKey/index.d.ts +1 -0
- package/src/lib/sessionKeys/registerSessionKey/registerSessionKey.d.ts +8 -0
- package/src/lib/sessionKeys/registerSessionKey/registerSessionKey.js +42 -0
- package/src/lib/sessionKeys/removeSessionKey/index.d.ts +1 -0
- package/src/lib/sessionKeys/removeSessionKey/removeSessionKey.d.ts +1 -0
- package/src/lib/sessionKeys/removeSessionKey/removeSessionKey.js +9 -0
- package/src/lib/sessionKeys/toEncodedFormat/index.d.ts +1 -0
- package/src/lib/sessionKeys/toEncodedFormat/toEncodedFormat.d.ts +1 -0
- package/src/lib/sessionKeys/toEncodedFormat/toEncodedFormat.js +15 -0
- package/src/lib/sessionKeys/useRegisterEmbeddedWalletSessionKey/index.d.ts +1 -0
- package/src/lib/sessionKeys/useRegisterEmbeddedWalletSessionKey/useRegisterEmbeddedWalletSessionKey.d.ts +11 -0
- package/src/lib/sessionKeys/useRegisterEmbeddedWalletSessionKey/useRegisterEmbeddedWalletSessionKey.js +101 -0
- package/src/lib/sessionKeys/useSetTurnkeyConnectorFetchers/index.d.ts +1 -0
- package/src/lib/sessionKeys/useSetTurnkeyConnectorFetchers/useSetTurnkeyConnectorFetchers.d.ts +4 -0
- package/src/lib/sessionKeys/useSetTurnkeyConnectorFetchers/useSetTurnkeyConnectorFetchers.js +18 -0
- package/src/lib/softDeleteEmbeddedWallet/index.d.ts +1 -0
- package/src/lib/softDeleteEmbeddedWallet/softDeleteEmbeddedWallet.d.ts +5 -0
- package/src/lib/softDeleteEmbeddedWallet/softDeleteEmbeddedWallet.js +21 -0
- package/src/lib/ui/AccountUpgradedView/AccountUpgradedView.d.ts +5 -0
- package/src/lib/ui/AccountUpgradedView/AccountUpgradedView.js +44 -0
- package/src/lib/ui/AccountUpgradedView/index.d.ts +1 -0
- package/src/lib/ui/LegacyEmbeddedWalletExport/LegacyEmbeddedWalletExport.d.ts +6 -0
- package/src/lib/ui/LegacyEmbeddedWalletExport/LegacyEmbeddedWalletExport.js +122 -0
- package/src/lib/ui/LegacyEmbeddedWalletExport/index.d.ts +1 -0
- package/src/lib/ui/LegacyWalletExportSheet/LegacyWalletExportSheet.d.ts +17 -0
- package/src/lib/ui/LegacyWalletExportSheet/LegacyWalletExportSheet.js +60 -0
- package/src/lib/ui/LegacyWalletExportSheet/index.d.ts +1 -0
- package/src/lib/ui/LegacyWalletMigrationContext/LegacyWalletMigrationContext.d.ts +42 -0
- package/src/lib/ui/LegacyWalletMigrationContext/LegacyWalletMigrationContext.js +109 -0
- package/src/lib/ui/LegacyWalletMigrationContext/index.d.ts +1 -0
- package/src/lib/ui/LegacyWalletMigrationModal/LegacyWalletMigrationModal.d.ts +15 -0
- package/src/lib/ui/LegacyWalletMigrationModal/LegacyWalletMigrationModal.js +51 -0
- package/src/lib/ui/LegacyWalletMigrationModal/index.d.ts +1 -0
- package/src/lib/ui/LegacyWalletMigrationRecoveryContext/LegacyWalletMigrationRecoveryContext.d.ts +25 -0
- package/src/lib/ui/LegacyWalletMigrationRecoveryContext/LegacyWalletMigrationRecoveryContext.js +213 -0
- package/src/lib/ui/LegacyWalletMigrationRecoveryContext/index.d.ts +1 -0
- package/src/lib/ui/WaasUpgradeView/WaasUpgradeView.d.ts +9 -0
- package/src/lib/ui/WaasUpgradeView/WaasUpgradeView.js +62 -0
- package/src/lib/ui/WaasUpgradeView/index.d.ts +1 -0
- package/src/lib/ui/WalletUpgradeFlowView/WalletUpgradeFlowView.d.ts +12 -0
- package/src/lib/ui/WalletUpgradeFlowView/WalletUpgradeFlowView.js +124 -0
- package/src/lib/ui/WalletUpgradeFlowView/index.d.ts +1 -0
- package/src/lib/ui/recovery/LegacyAddRecoveryEmailView/LegacyAddRecoveryEmailView.d.ts +9 -0
- package/src/lib/ui/recovery/LegacyAddRecoveryEmailView/LegacyAddRecoveryEmailView.js +21 -0
- package/src/lib/ui/recovery/LegacyAddRecoveryEmailView/index.d.ts +1 -0
- package/src/lib/ui/recovery/LegacyEmbeddedAuthChoiceView/LegacyEmbeddedAuthChoiceView.d.ts +9 -0
- package/src/lib/ui/recovery/LegacyEmbeddedAuthChoiceView/LegacyEmbeddedAuthChoiceView.js +29 -0
- package/src/lib/ui/recovery/LegacyEmbeddedAuthChoiceView/index.d.ts +1 -0
- package/src/lib/ui/recovery/LegacyPasskeyBundleRecoveryView/LegacyPasskeyBundleRecoveryView.d.ts +10 -0
- package/src/lib/ui/recovery/LegacyPasskeyBundleRecoveryView/LegacyPasskeyBundleRecoveryView.js +36 -0
- package/src/lib/ui/recovery/LegacyPasskeyBundleRecoveryView/index.d.ts +1 -0
- package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/LegacyPasskeyCompleteRecoveryView.d.ts +8 -0
- package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/LegacyPasskeyCompleteRecoveryView.js +22 -0
- package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/index.d.ts +1 -0
- package/src/lib/ui/recovery/index.d.ts +4 -0
- package/src/lib/ui/useLegacyWalletExport/index.d.ts +1 -0
- package/src/lib/ui/useLegacyWalletExport/useLegacyWalletExport.d.ts +9 -0
- package/src/lib/ui/useLegacyWalletExport/useLegacyWalletExport.js +75 -0
- package/src/lib/upgradeToDynamicWaas/index.d.ts +1 -0
- package/src/lib/upgradeToDynamicWaas/upgradeToDynamicWaas.d.ts +13 -0
- package/src/lib/upgradeToDynamicWaas/upgradeToDynamicWaas.js +72 -0
- package/src/lib/useLegacyWalletsToMigrate/index.d.ts +2 -0
- package/src/lib/useLegacyWalletsToMigrate/useHasLegacyWalletsToMigrate.d.ts +6 -0
- package/src/lib/useLegacyWalletsToMigrate/useHasLegacyWalletsToMigrate.js +14 -0
- package/src/lib/useLegacyWalletsToMigrate/useLegacyWalletsToMigrate.d.ts +10 -0
- package/src/lib/useLegacyWalletsToMigrate/useLegacyWalletsToMigrate.js +32 -0
- package/src/lib/useUpgradeToDynamicWaas/index.d.ts +1 -0
- package/src/lib/useUpgradeToDynamicWaas/useUpgradeToDynamicWaas.d.ts +20 -0
- package/src/lib/useUpgradeToDynamicWaas/useUpgradeToDynamicWaas.js +44 -0
package/src/lib/ui/recovery/LegacyPasskeyBundleRecoveryView/LegacyPasskeyBundleRecoveryView.js
ADDED
|
@@ -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';
|
package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/LegacyPasskeyCompleteRecoveryView.d.ts
ADDED
|
@@ -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>;
|
package/src/lib/ui/recovery/LegacyPasskeyCompleteRecoveryView/LegacyPasskeyCompleteRecoveryView.js
ADDED
|
@@ -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,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 };
|