@dynamic-labs/sdk-react-core 4.60.0 → 4.61.0

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 (64) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/package.cjs +4 -4
  3. package/package.js +4 -4
  4. package/package.json +15 -15
  5. package/src/index.cjs +4 -4
  6. package/src/index.d.ts +1 -1
  7. package/src/index.js +2 -2
  8. package/src/lib/layout/DynamicAuthLayout/Header/header.cjs +2 -1
  9. package/src/lib/layout/DynamicAuthLayout/Header/header.js +2 -1
  10. package/src/lib/shared/assets/error-circle-x.cjs +54 -0
  11. package/src/lib/shared/assets/error-circle-x.js +30 -0
  12. package/src/lib/shared/assets/index.d.ts +1 -0
  13. package/src/lib/shared/types/dynamicHandlers.d.ts +64 -0
  14. package/src/lib/shared/utils/functions/chain/getChainIcon.cjs +1 -0
  15. package/src/lib/shared/utils/functions/chain/getChainIcon.js +2 -1
  16. package/src/lib/styles/index.shadow.cjs +1 -1
  17. package/src/lib/styles/index.shadow.js +1 -1
  18. package/src/lib/utils/hooks/index.d.ts +3 -1
  19. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.cjs +18 -16
  20. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.d.ts +4 -8
  21. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.js +18 -16
  22. package/src/lib/utils/hooks/useGetWalletPassword/index.d.ts +2 -0
  23. package/src/lib/utils/hooks/useGetWalletPassword/useGetWalletPassword.cjs +130 -0
  24. package/src/lib/utils/hooks/useGetWalletPassword/useGetWalletPassword.d.ts +6 -0
  25. package/src/lib/utils/hooks/useGetWalletPassword/useGetWalletPassword.js +126 -0
  26. package/src/lib/utils/hooks/useSetWalletConnectorFetchers/useSetWalletConnectorFetchers.cjs +7 -2
  27. package/src/lib/utils/hooks/useSetWalletConnectorFetchers/useSetWalletConnectorFetchers.js +7 -2
  28. package/src/lib/utils/hooks/useSetupPassword/useSetupPassword.cjs +87 -0
  29. package/src/lib/utils/hooks/useSetupPassword/useSetupPassword.d.ts +3 -0
  30. package/src/lib/utils/hooks/useSetupPassword/useSetupPassword.js +88 -1
  31. package/src/lib/utils/hooks/useSmartWallets/useSmartWallets.cjs +1 -1
  32. package/src/lib/utils/hooks/useSmartWallets/useSmartWallets.js +1 -1
  33. package/src/lib/utils/hooks/useSyncDynamicWaas/useSyncDynamicWaas.cjs +1 -1
  34. package/src/lib/utils/hooks/useSyncDynamicWaas/useSyncDynamicWaas.js +1 -1
  35. package/src/lib/utils/hooks/useUserAuth/useUserAuth.cjs +12 -4
  36. package/src/lib/utils/hooks/useUserAuth/useUserAuth.js +12 -4
  37. package/src/lib/utils/hooks/useWalletBackup/useWalletBackup.cjs +1 -1
  38. package/src/lib/utils/hooks/useWalletBackup/useWalletBackup.js +1 -1
  39. package/src/lib/utils/hooks/useWalletDelegation/useWalletDelegation.cjs +1 -1
  40. package/src/lib/utils/hooks/useWalletDelegation/useWalletDelegation.js +1 -1
  41. package/src/lib/utils/hooks/useWalletPassword/index.d.ts +1 -0
  42. package/src/lib/utils/hooks/useWalletPassword/useWalletPassword.cjs +152 -0
  43. package/src/lib/utils/hooks/useWalletPassword/useWalletPassword.d.ts +30 -0
  44. package/src/lib/utils/hooks/useWalletPassword/useWalletPassword.js +148 -0
  45. package/src/lib/views/UnlockWalletView/UnlockWalletView.cjs +32 -1
  46. package/src/lib/views/UnlockWalletView/UnlockWalletView.js +32 -1
  47. package/src/lib/widgets/DynamicWidget/components/DynamicWidgetViews/mapViewToComponent.cjs +2 -2
  48. package/src/lib/widgets/DynamicWidget/components/DynamicWidgetViews/mapViewToComponent.js +2 -2
  49. package/src/lib/widgets/DynamicWidget/views/AccountAndSecuritySettingsView/MfaSection/MfaSection.cjs +11 -14
  50. package/src/lib/widgets/DynamicWidget/views/AccountAndSecuritySettingsView/MfaSection/MfaSection.js +11 -14
  51. package/src/lib/widgets/DynamicWidget/views/EnterPasswordView/EnterPasswordView.cjs +15 -5
  52. package/src/lib/widgets/DynamicWidget/views/EnterPasswordView/EnterPasswordView.js +15 -5
  53. package/src/lib/widgets/DynamicWidget/views/SetupPasswordKnowledgeCheckView/SetupPasswordKnowledgeCheckView.cjs +7 -15
  54. package/src/lib/widgets/DynamicWidget/views/SetupPasswordKnowledgeCheckView/SetupPasswordKnowledgeCheckView.d.ts +0 -1
  55. package/src/lib/widgets/DynamicWidget/views/SetupPasswordKnowledgeCheckView/SetupPasswordKnowledgeCheckView.js +7 -15
  56. package/src/lib/widgets/DynamicWidget/views/SetupPasswordTermsView/SetupPasswordTermsView.cjs +9 -2
  57. package/src/lib/widgets/DynamicWidget/views/SetupPasswordTermsView/SetupPasswordTermsView.d.ts +1 -1
  58. package/src/lib/widgets/DynamicWidget/views/SetupPasswordTermsView/SetupPasswordTermsView.js +9 -2
  59. package/src/lib/widgets/DynamicWidget/views/SetupPasswordView/SetupPasswordView.cjs +13 -8
  60. package/src/lib/widgets/DynamicWidget/views/SetupPasswordView/SetupPasswordView.js +13 -8
  61. package/src/lib/utils/hooks/useGetPasswordForSigning/index.d.ts +0 -2
  62. package/src/lib/utils/hooks/useGetPasswordForSigning/useGetPasswordForSigning.cjs +0 -16
  63. package/src/lib/utils/hooks/useGetPasswordForSigning/useGetPasswordForSigning.d.ts +0 -5
  64. package/src/lib/utils/hooks/useGetPasswordForSigning/useGetPasswordForSigning.js +0 -12
@@ -0,0 +1,152 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../../../../../_virtual/_tslib.cjs');
7
+ var React = require('react');
8
+ var dynamicEvents = require('../../../events/dynamicEvents.cjs');
9
+ require('@dynamic-labs/iconic');
10
+ require('@dynamic-labs/wallet-connector-core');
11
+ require('react/jsx-runtime');
12
+ require('../../../context/ViewContext/ViewContext.cjs');
13
+ var logger = require('../../../shared/logger.cjs');
14
+ require('@dynamic-labs/wallet-book');
15
+ require('@dynamic-labs/utils');
16
+ require('../../constants/colors.cjs');
17
+ require('../../constants/values.cjs');
18
+ require('@dynamic-labs/sdk-api-core');
19
+ require('../../../shared/consts/index.cjs');
20
+ var useDynamicWaas = require('../useDynamicWaas/useDynamicWaas.cjs');
21
+
22
+ const INITIAL_STATE = {
23
+ error: null,
24
+ isLoading: false,
25
+ recoveryState: null,
26
+ };
27
+ const useWalletPassword = () => {
28
+ const { getWaasWalletConnector } = useDynamicWaas.useDynamicWaas();
29
+ const [state, setState] = React.useState(INITIAL_STATE);
30
+ const resetState = React.useCallback(() => {
31
+ setState(INITIAL_STATE);
32
+ }, []);
33
+ const updatePassword = React.useCallback((params) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
34
+ const { accountAddress, chainName, newPassword, existingPassword } = params;
35
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: true })));
36
+ try {
37
+ const connector = getWaasWalletConnector(chainName);
38
+ if (!connector) {
39
+ const errorMessage = 'Wallet connector not found';
40
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
41
+ logger.logger.error(errorMessage, { accountAddress, chainName });
42
+ return false;
43
+ }
44
+ yield connector.updatePassword({
45
+ accountAddress,
46
+ existingPassword,
47
+ newPassword,
48
+ });
49
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: false })));
50
+ return true;
51
+ }
52
+ catch (error) {
53
+ const errorMessage = error instanceof Error ? error.message : 'Failed to update password';
54
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
55
+ logger.logger.error('Failed to update wallet password', {
56
+ accountAddress,
57
+ chainName,
58
+ error,
59
+ });
60
+ return false;
61
+ }
62
+ }), [getWaasWalletConnector]);
63
+ const unlockWallet = React.useCallback((params) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
64
+ const { accountAddress, chainName, password } = params;
65
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: true })));
66
+ try {
67
+ const connector = getWaasWalletConnector(chainName);
68
+ if (!connector) {
69
+ const errorMessage = 'Wallet connector not found';
70
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
71
+ logger.logger.error(errorMessage, { accountAddress, chainName });
72
+ return false;
73
+ }
74
+ dynamicEvents.dynamicEvents.emit('walletUnlockAttempt', {
75
+ accountAddress,
76
+ chainName,
77
+ });
78
+ yield connector.unlockWallet({
79
+ accountAddress,
80
+ password,
81
+ });
82
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: false })));
83
+ dynamicEvents.dynamicEvents.emit('walletUnlockCompleted', {
84
+ accountAddress,
85
+ chainName,
86
+ });
87
+ return true;
88
+ }
89
+ catch (error) {
90
+ const errorMessage = error instanceof Error ? error.message : 'Failed to unlock wallet';
91
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
92
+ logger.logger.error('Failed to unlock wallet', {
93
+ accountAddress,
94
+ chainName,
95
+ error,
96
+ });
97
+ dynamicEvents.dynamicEvents.emit('walletUnlockFailed', {
98
+ accountAddress,
99
+ chainName,
100
+ error,
101
+ });
102
+ return false;
103
+ }
104
+ }), [getWaasWalletConnector]);
105
+ const checkWalletLockState = React.useCallback((params) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
106
+ const { accountAddress, chainName } = params;
107
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: true })));
108
+ try {
109
+ const connector = getWaasWalletConnector(chainName);
110
+ if (!connector) {
111
+ const errorMessage = 'Wallet connector not found';
112
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
113
+ logger.logger.error(errorMessage, { accountAddress, chainName });
114
+ return null;
115
+ }
116
+ const recoveryState = yield connector.getWalletRecoveryState({
117
+ accountAddress,
118
+ });
119
+ setState({
120
+ error: null,
121
+ isLoading: false,
122
+ recoveryState,
123
+ });
124
+ return recoveryState;
125
+ }
126
+ catch (error) {
127
+ const errorMessage = error instanceof Error
128
+ ? error.message
129
+ : 'Failed to check wallet state';
130
+ setState({
131
+ error: errorMessage,
132
+ isLoading: false,
133
+ recoveryState: null,
134
+ });
135
+ logger.logger.error('Failed to check wallet lock state', {
136
+ accountAddress,
137
+ chainName,
138
+ error,
139
+ });
140
+ return null;
141
+ }
142
+ }), [getWaasWalletConnector]);
143
+ return {
144
+ checkWalletLockState,
145
+ resetState,
146
+ state,
147
+ unlockWallet,
148
+ updatePassword,
149
+ };
150
+ };
151
+
152
+ exports.useWalletPassword = useWalletPassword;
@@ -0,0 +1,30 @@
1
+ import { WalletRecoveryState } from '@dynamic-labs-wallet/browser-wallet-client';
2
+ import { ChainEnum } from '@dynamic-labs/sdk-api-core';
3
+ export type UpdatePasswordParams = {
4
+ accountAddress: string;
5
+ chainName: ChainEnum;
6
+ newPassword: string;
7
+ existingPassword?: string;
8
+ };
9
+ export type UnlockWalletParams = {
10
+ accountAddress: string;
11
+ chainName: ChainEnum;
12
+ password: string;
13
+ };
14
+ export type CheckWalletLockStateParams = {
15
+ accountAddress: string;
16
+ chainName: ChainEnum;
17
+ };
18
+ export type WalletPasswordState = {
19
+ isLoading: boolean;
20
+ error: string | null;
21
+ recoveryState: WalletRecoveryState | null;
22
+ };
23
+ export type UseWalletPasswordReturn = {
24
+ updatePassword: (params: UpdatePasswordParams) => Promise<boolean>;
25
+ unlockWallet: (params: UnlockWalletParams) => Promise<boolean>;
26
+ checkWalletLockState: (params: CheckWalletLockStateParams) => Promise<WalletRecoveryState | null>;
27
+ state: WalletPasswordState;
28
+ resetState: () => void;
29
+ };
30
+ export declare const useWalletPassword: () => UseWalletPasswordReturn;
@@ -0,0 +1,148 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../../_virtual/_tslib.js';
3
+ import { useState, useCallback } from 'react';
4
+ import { dynamicEvents } from '../../../events/dynamicEvents.js';
5
+ import '@dynamic-labs/iconic';
6
+ import '@dynamic-labs/wallet-connector-core';
7
+ import 'react/jsx-runtime';
8
+ import '../../../context/ViewContext/ViewContext.js';
9
+ import { logger } from '../../../shared/logger.js';
10
+ import '@dynamic-labs/wallet-book';
11
+ import '@dynamic-labs/utils';
12
+ import '../../constants/colors.js';
13
+ import '../../constants/values.js';
14
+ import '@dynamic-labs/sdk-api-core';
15
+ import '../../../shared/consts/index.js';
16
+ import { useDynamicWaas } from '../useDynamicWaas/useDynamicWaas.js';
17
+
18
+ const INITIAL_STATE = {
19
+ error: null,
20
+ isLoading: false,
21
+ recoveryState: null,
22
+ };
23
+ const useWalletPassword = () => {
24
+ const { getWaasWalletConnector } = useDynamicWaas();
25
+ const [state, setState] = useState(INITIAL_STATE);
26
+ const resetState = useCallback(() => {
27
+ setState(INITIAL_STATE);
28
+ }, []);
29
+ const updatePassword = useCallback((params) => __awaiter(void 0, void 0, void 0, function* () {
30
+ const { accountAddress, chainName, newPassword, existingPassword } = params;
31
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: true })));
32
+ try {
33
+ const connector = getWaasWalletConnector(chainName);
34
+ if (!connector) {
35
+ const errorMessage = 'Wallet connector not found';
36
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
37
+ logger.error(errorMessage, { accountAddress, chainName });
38
+ return false;
39
+ }
40
+ yield connector.updatePassword({
41
+ accountAddress,
42
+ existingPassword,
43
+ newPassword,
44
+ });
45
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: false })));
46
+ return true;
47
+ }
48
+ catch (error) {
49
+ const errorMessage = error instanceof Error ? error.message : 'Failed to update password';
50
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
51
+ logger.error('Failed to update wallet password', {
52
+ accountAddress,
53
+ chainName,
54
+ error,
55
+ });
56
+ return false;
57
+ }
58
+ }), [getWaasWalletConnector]);
59
+ const unlockWallet = useCallback((params) => __awaiter(void 0, void 0, void 0, function* () {
60
+ const { accountAddress, chainName, password } = params;
61
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: true })));
62
+ try {
63
+ const connector = getWaasWalletConnector(chainName);
64
+ if (!connector) {
65
+ const errorMessage = 'Wallet connector not found';
66
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
67
+ logger.error(errorMessage, { accountAddress, chainName });
68
+ return false;
69
+ }
70
+ dynamicEvents.emit('walletUnlockAttempt', {
71
+ accountAddress,
72
+ chainName,
73
+ });
74
+ yield connector.unlockWallet({
75
+ accountAddress,
76
+ password,
77
+ });
78
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: false })));
79
+ dynamicEvents.emit('walletUnlockCompleted', {
80
+ accountAddress,
81
+ chainName,
82
+ });
83
+ return true;
84
+ }
85
+ catch (error) {
86
+ const errorMessage = error instanceof Error ? error.message : 'Failed to unlock wallet';
87
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
88
+ logger.error('Failed to unlock wallet', {
89
+ accountAddress,
90
+ chainName,
91
+ error,
92
+ });
93
+ dynamicEvents.emit('walletUnlockFailed', {
94
+ accountAddress,
95
+ chainName,
96
+ error,
97
+ });
98
+ return false;
99
+ }
100
+ }), [getWaasWalletConnector]);
101
+ const checkWalletLockState = useCallback((params) => __awaiter(void 0, void 0, void 0, function* () {
102
+ const { accountAddress, chainName } = params;
103
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: null, isLoading: true })));
104
+ try {
105
+ const connector = getWaasWalletConnector(chainName);
106
+ if (!connector) {
107
+ const errorMessage = 'Wallet connector not found';
108
+ setState((prev) => (Object.assign(Object.assign({}, prev), { error: errorMessage, isLoading: false })));
109
+ logger.error(errorMessage, { accountAddress, chainName });
110
+ return null;
111
+ }
112
+ const recoveryState = yield connector.getWalletRecoveryState({
113
+ accountAddress,
114
+ });
115
+ setState({
116
+ error: null,
117
+ isLoading: false,
118
+ recoveryState,
119
+ });
120
+ return recoveryState;
121
+ }
122
+ catch (error) {
123
+ const errorMessage = error instanceof Error
124
+ ? error.message
125
+ : 'Failed to check wallet state';
126
+ setState({
127
+ error: errorMessage,
128
+ isLoading: false,
129
+ recoveryState: null,
130
+ });
131
+ logger.error('Failed to check wallet lock state', {
132
+ accountAddress,
133
+ chainName,
134
+ error,
135
+ });
136
+ return null;
137
+ }
138
+ }), [getWaasWalletConnector]);
139
+ return {
140
+ checkWalletLockState,
141
+ resetState,
142
+ state,
143
+ unlockWallet,
144
+ updatePassword,
145
+ };
146
+ };
147
+
148
+ export { useWalletPassword };
@@ -77,6 +77,7 @@ require('qrcode');
77
77
  require('formik');
78
78
  require('../../utils/hooks/useSubdomainCheck/useSubdomainCheck.cjs');
79
79
  require('../../context/WalletGroupContext/WalletGroupContext.cjs');
80
+ var useDynamicWaas = require('../../utils/hooks/useDynamicWaas/useDynamicWaas.cjs');
80
81
  var EnterPasswordView = require('../../widgets/DynamicWidget/views/EnterPasswordView/EnterPasswordView.cjs');
81
82
  require('../../utils/hooks/useWalletBackup/useWalletBackup.cjs');
82
83
  require('../../utils/hooks/useWalletBackup/types.cjs');
@@ -110,18 +111,48 @@ var useInternalDynamicContext = require('../../context/DynamicContext/useDynamic
110
111
  const UnlockWalletView = ({ accountAddress, chainName, }) => {
111
112
  const { t } = reactI18next.useTranslation();
112
113
  const { setShowAuthFlow } = useInternalDynamicContext.useInternalDynamicContext();
114
+ const { getWaasWalletConnector } = useDynamicWaas.useDynamicWaas();
113
115
  const handleContinue = React.useCallback((password) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
116
+ const connector = getWaasWalletConnector(chainName);
117
+ if (!connector) {
118
+ const error = new Error(t('dyn_enter_password.error.failed'));
119
+ dynamicEvents.dynamicEvents.emit('walletUnlockAttempt', {
120
+ accountAddress,
121
+ chainName,
122
+ });
123
+ dynamicEvents.dynamicEvents.emit('walletUnlockFailed', {
124
+ accountAddress,
125
+ chainName,
126
+ error,
127
+ });
128
+ throw error;
129
+ }
114
130
  dynamicEvents.dynamicEvents.emit('walletUnlockAttempt', {
115
131
  accountAddress,
116
132
  chainName,
117
133
  });
134
+ try {
135
+ yield connector.unlockWallet({ accountAddress, password });
136
+ }
137
+ catch (error) {
138
+ dynamicEvents.dynamicEvents.emit('walletUnlockFailed', {
139
+ accountAddress,
140
+ chainName,
141
+ error,
142
+ });
143
+ throw error;
144
+ }
145
+ dynamicEvents.dynamicEvents.emit('walletUnlockCompleted', {
146
+ accountAddress,
147
+ chainName,
148
+ });
118
149
  dynamicEvents.dynamicEvents.emit('walletUnlockPasswordProvided', {
119
150
  accountAddress,
120
151
  chainName,
121
152
  password,
122
153
  });
123
154
  setShowAuthFlow(false);
124
- }), [accountAddress, chainName, setShowAuthFlow]);
155
+ }), [accountAddress, chainName, getWaasWalletConnector, setShowAuthFlow, t]);
125
156
  return (jsxRuntime.jsx(EnterPasswordView.EnterPasswordView, { onContinue: handleContinue, title: t('dyn_unlock_wallet.title'), description: t('dyn_unlock_wallet.description'), buttonLabel: t('dyn_unlock_wallet.button.continue') }));
126
157
  };
127
158
 
@@ -73,6 +73,7 @@ import 'qrcode';
73
73
  import 'formik';
74
74
  import '../../utils/hooks/useSubdomainCheck/useSubdomainCheck.js';
75
75
  import '../../context/WalletGroupContext/WalletGroupContext.js';
76
+ import { useDynamicWaas } from '../../utils/hooks/useDynamicWaas/useDynamicWaas.js';
76
77
  import { EnterPasswordView } from '../../widgets/DynamicWidget/views/EnterPasswordView/EnterPasswordView.js';
77
78
  import '../../utils/hooks/useWalletBackup/useWalletBackup.js';
78
79
  import '../../utils/hooks/useWalletBackup/types.js';
@@ -106,18 +107,48 @@ import { useInternalDynamicContext } from '../../context/DynamicContext/useDynam
106
107
  const UnlockWalletView = ({ accountAddress, chainName, }) => {
107
108
  const { t } = useTranslation();
108
109
  const { setShowAuthFlow } = useInternalDynamicContext();
110
+ const { getWaasWalletConnector } = useDynamicWaas();
109
111
  const handleContinue = useCallback((password) => __awaiter(void 0, void 0, void 0, function* () {
112
+ const connector = getWaasWalletConnector(chainName);
113
+ if (!connector) {
114
+ const error = new Error(t('dyn_enter_password.error.failed'));
115
+ dynamicEvents.emit('walletUnlockAttempt', {
116
+ accountAddress,
117
+ chainName,
118
+ });
119
+ dynamicEvents.emit('walletUnlockFailed', {
120
+ accountAddress,
121
+ chainName,
122
+ error,
123
+ });
124
+ throw error;
125
+ }
110
126
  dynamicEvents.emit('walletUnlockAttempt', {
111
127
  accountAddress,
112
128
  chainName,
113
129
  });
130
+ try {
131
+ yield connector.unlockWallet({ accountAddress, password });
132
+ }
133
+ catch (error) {
134
+ dynamicEvents.emit('walletUnlockFailed', {
135
+ accountAddress,
136
+ chainName,
137
+ error,
138
+ });
139
+ throw error;
140
+ }
141
+ dynamicEvents.emit('walletUnlockCompleted', {
142
+ accountAddress,
143
+ chainName,
144
+ });
114
145
  dynamicEvents.emit('walletUnlockPasswordProvided', {
115
146
  accountAddress,
116
147
  chainName,
117
148
  password,
118
149
  });
119
150
  setShowAuthFlow(false);
120
- }), [accountAddress, chainName, setShowAuthFlow]);
151
+ }), [accountAddress, chainName, getWaasWalletConnector, setShowAuthFlow, t]);
121
152
  return (jsx(EnterPasswordView, { onContinue: handleContinue, title: t('dyn_unlock_wallet.title'), description: t('dyn_unlock_wallet.description'), buttonLabel: t('dyn_unlock_wallet.button.continue') }));
122
153
  };
123
154
 
@@ -25,6 +25,8 @@ var SetupPasswordConfirmView = require('../../views/SetupPasswordConfirmView/Set
25
25
  var SetupPasswordKnowledgeCheckView = require('../../views/SetupPasswordKnowledgeCheckView/SetupPasswordKnowledgeCheckView.cjs');
26
26
  var SetupPasswordSuccessView = require('../../views/SetupPasswordSuccessView/SetupPasswordSuccessView.cjs');
27
27
  require('react-i18next');
28
+ require('../../../../components/Input/Input.cjs');
29
+ require('../../../../components/Accordion/components/AccordionItem/AccordionItem.cjs');
28
30
  require('@dynamic-labs/wallet-connector-core');
29
31
  require('../../../../shared/logger.cjs');
30
32
  require('@dynamic-labs/wallet-book');
@@ -32,8 +34,6 @@ require('../../../../utils/constants/colors.cjs');
32
34
  require('../../../../utils/constants/values.cjs');
33
35
  require('@dynamic-labs/sdk-api-core');
34
36
  require('../../../../shared/consts/index.cjs');
35
- require('../../../../components/Input/Input.cjs');
36
- require('../../../../components/Accordion/components/AccordionItem/AccordionItem.cjs');
37
37
  require('../../../../components/Alert/Alert.cjs');
38
38
  require('../../../../events/dynamicEvents.cjs');
39
39
  require('../../../../context/DynamicContext/DynamicContext.cjs');
@@ -21,6 +21,8 @@ import { SetupPasswordConfirmView } from '../../views/SetupPasswordConfirmView/S
21
21
  import { SetupPasswordKnowledgeCheckView } from '../../views/SetupPasswordKnowledgeCheckView/SetupPasswordKnowledgeCheckView.js';
22
22
  import { SetupPasswordSuccessView } from '../../views/SetupPasswordSuccessView/SetupPasswordSuccessView.js';
23
23
  import 'react-i18next';
24
+ import '../../../../components/Input/Input.js';
25
+ import '../../../../components/Accordion/components/AccordionItem/AccordionItem.js';
24
26
  import '@dynamic-labs/wallet-connector-core';
25
27
  import '../../../../shared/logger.js';
26
28
  import '@dynamic-labs/wallet-book';
@@ -28,8 +30,6 @@ import '../../../../utils/constants/colors.js';
28
30
  import '../../../../utils/constants/values.js';
29
31
  import '@dynamic-labs/sdk-api-core';
30
32
  import '../../../../shared/consts/index.js';
31
- import '../../../../components/Input/Input.js';
32
- import '../../../../components/Accordion/components/AccordionItem/AccordionItem.js';
33
33
  import '../../../../components/Alert/Alert.js';
34
34
  import '../../../../events/dynamicEvents.js';
35
35
  import '../../../../context/DynamicContext/DynamicContext.js';
@@ -114,6 +114,7 @@ require('../../../../../store/state/tokenBalances.cjs');
114
114
  require('../../../../../store/state/multichainBalances.cjs');
115
115
  require('../../../../../shared/utils/functions/getInitialUrl/getInitialUrl.cjs');
116
116
  var useIsPasskeysMfaEnabled = require('../../../../../utils/hooks/useIsPasskeysMfaEnabled/useIsPasskeysMfaEnabled.cjs');
117
+ var useWalletPassword = require('../../../../../utils/hooks/useWalletPassword/useWalletPassword.cjs');
117
118
  var useInternalDynamicContext = require('../../../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.cjs');
118
119
 
119
120
  const MfaSection = ({ isLoading }) => {
@@ -123,6 +124,7 @@ const MfaSection = ({ isLoading }) => {
123
124
  const { primaryWallet } = useInternalDynamicContext.useInternalDynamicContext();
124
125
  const { getEOAWallet } = useSmartWallets.useSmartWallets();
125
126
  const projectSettings = useProjectSettings.useProjectSettings();
127
+ const { updatePassword } = useWalletPassword.useWalletPassword();
126
128
  const isMfaEnabled = useIsMfaEnabled.useIsMfaEnabled();
127
129
  const isTotpMfaEnabled = useIsTotpMfaEnabled.useIsTotpMfaEnabled();
128
130
  const isPasskeyMfaEnabled = useIsPasskeysMfaEnabled.useIsPasskeysMfaEnabled();
@@ -136,24 +138,19 @@ const MfaSection = ({ isLoading }) => {
136
138
  const handlePasscodeClick = React.useCallback(() => {
137
139
  setDynamicWidgetView('setup-password', {
138
140
  onComplete: (password) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
139
- if (!(wallet === null || wallet === void 0 ? void 0 : wallet.address)) {
140
- logger.logger.error('No wallet address available for password setup');
141
+ if (!(wallet === null || wallet === void 0 ? void 0 : wallet.address) || !(wallet === null || wallet === void 0 ? void 0 : wallet.chain)) {
142
+ logger.logger.error('No wallet address or chain available for password setup');
141
143
  return;
142
144
  }
143
- try {
144
- const connector = wallet.connector;
145
- yield connector.updatePassword({
146
- accountAddress: wallet.address,
147
- existingPassword: '',
148
- newPassword: password,
149
- });
150
- }
151
- catch (error) {
152
- logger.logger.error('Failed to update password on modal', error);
153
- }
145
+ yield updatePassword({
146
+ accountAddress: wallet.address,
147
+ chainName: wallet.chain,
148
+ existingPassword: '',
149
+ newPassword: password,
150
+ });
154
151
  }),
155
152
  });
156
- }, [setDynamicWidgetView, wallet]);
153
+ }, [setDynamicWidgetView, wallet, updatePassword]);
157
154
  if (!isMfaEnabled && !isWaasWallet) {
158
155
  return null;
159
156
  }
@@ -110,6 +110,7 @@ import '../../../../../store/state/tokenBalances.js';
110
110
  import '../../../../../store/state/multichainBalances.js';
111
111
  import '../../../../../shared/utils/functions/getInitialUrl/getInitialUrl.js';
112
112
  import { useIsPasskeysMfaEnabled } from '../../../../../utils/hooks/useIsPasskeysMfaEnabled/useIsPasskeysMfaEnabled.js';
113
+ import { useWalletPassword } from '../../../../../utils/hooks/useWalletPassword/useWalletPassword.js';
113
114
  import { useInternalDynamicContext } from '../../../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.js';
114
115
 
115
116
  const MfaSection = ({ isLoading }) => {
@@ -119,6 +120,7 @@ const MfaSection = ({ isLoading }) => {
119
120
  const { primaryWallet } = useInternalDynamicContext();
120
121
  const { getEOAWallet } = useSmartWallets();
121
122
  const projectSettings = useProjectSettings();
123
+ const { updatePassword } = useWalletPassword();
122
124
  const isMfaEnabled = useIsMfaEnabled();
123
125
  const isTotpMfaEnabled = useIsTotpMfaEnabled();
124
126
  const isPasskeyMfaEnabled = useIsPasskeysMfaEnabled();
@@ -132,24 +134,19 @@ const MfaSection = ({ isLoading }) => {
132
134
  const handlePasscodeClick = useCallback(() => {
133
135
  setDynamicWidgetView('setup-password', {
134
136
  onComplete: (password) => __awaiter(void 0, void 0, void 0, function* () {
135
- if (!(wallet === null || wallet === void 0 ? void 0 : wallet.address)) {
136
- logger.error('No wallet address available for password setup');
137
+ if (!(wallet === null || wallet === void 0 ? void 0 : wallet.address) || !(wallet === null || wallet === void 0 ? void 0 : wallet.chain)) {
138
+ logger.error('No wallet address or chain available for password setup');
137
139
  return;
138
140
  }
139
- try {
140
- const connector = wallet.connector;
141
- yield connector.updatePassword({
142
- accountAddress: wallet.address,
143
- existingPassword: '',
144
- newPassword: password,
145
- });
146
- }
147
- catch (error) {
148
- logger.error('Failed to update password on modal', error);
149
- }
141
+ yield updatePassword({
142
+ accountAddress: wallet.address,
143
+ chainName: wallet.chain,
144
+ existingPassword: '',
145
+ newPassword: password,
146
+ });
150
147
  }),
151
148
  });
152
- }, [setDynamicWidgetView, wallet]);
149
+ }, [setDynamicWidgetView, wallet, updatePassword]);
153
150
  if (!isMfaEnabled && !isWaasWallet) {
154
151
  return null;
155
152
  }
@@ -7,16 +7,17 @@ var _tslib = require('../../../../../../_virtual/_tslib.cjs');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
8
  var React = require('react');
9
9
  var reactI18next = require('react-i18next');
10
- var ErrorContainer = require('../../../../components/ErrorContainer/ErrorContainer.cjs');
11
10
  var Icon = require('../../../../components/Icon/Icon.cjs');
12
11
  var Input = require('../../../../components/Input/Input.cjs');
13
12
  var ToggleVisibilityButton = require('../../../../components/ToggleVisibilityButton/ToggleVisibilityButton.cjs');
14
13
  var Typography = require('../../../../components/Typography/Typography.cjs');
15
14
  var TypographyButton = require('../../../../components/TypographyButton/TypographyButton.cjs');
15
+ var errorCircleX = require('../../../../shared/assets/error-circle-x.cjs');
16
16
  var passwordLockIcon = require('../../../../shared/assets/password-lock-icon.cjs');
17
17
  require('@dynamic-labs/iconic');
18
18
  require('../../../../context/ViewContext/ViewContext.cjs');
19
19
 
20
+ const INVALID_PASSWORD_ERROR_MESSAGE = 'Decryption failed: Invalid password';
20
21
  const EnterPasswordView = ({ onContinue, title, description, buttonLabel, isLoading: externalLoading, }) => {
21
22
  const { t } = reactI18next.useTranslation();
22
23
  const [password, setPassword] = React.useState('');
@@ -41,9 +42,18 @@ const EnterPasswordView = ({ onContinue, title, description, buttonLabel, isLoad
41
42
  yield onContinue(password);
42
43
  }
43
44
  catch (err) {
44
- const errorMessage = err instanceof Error
45
- ? err.message
46
- : t('dyn_enter_password.error.failed');
45
+ let errorMessage;
46
+ if (err instanceof Error) {
47
+ if (err.message.includes(INVALID_PASSWORD_ERROR_MESSAGE)) {
48
+ errorMessage = t('dyn_enter_password.error.invalid_password');
49
+ }
50
+ else {
51
+ errorMessage = err.message;
52
+ }
53
+ }
54
+ else {
55
+ errorMessage = t('dyn_enter_password.error.failed');
56
+ }
47
57
  setError(errorMessage);
48
58
  }
49
59
  finally {
@@ -51,7 +61,7 @@ const EnterPasswordView = ({ onContinue, title, description, buttonLabel, isLoad
51
61
  }
52
62
  }), [password, onContinue, t]);
53
63
  const loading = externalLoading || isLoading;
54
- return (jsxRuntime.jsx("div", { className: 'enter-password-view', children: jsxRuntime.jsxs("div", { className: 'enter-password-view__body', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'title', color: 'primary', copykey: 'dyn_enter_password.title', className: 'enter-password-view__title', style: { marginBottom: '24px', textAlign: 'center' }, children: title !== null && title !== void 0 ? title : t('dyn_enter_password.title') }), jsxRuntime.jsx("div", { className: 'enter-password-view__icon-container', children: jsxRuntime.jsx(Icon.Icon, { color: 'brand-primary', children: jsxRuntime.jsx(passwordLockIcon.ReactComponent, { width: 64, height: 64 }) }) }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_enter_password.description', className: 'enter-password-view__description', children: description !== null && description !== void 0 ? description : t('dyn_enter_password.description') }), error && (jsxRuntime.jsx(ErrorContainer.ErrorContainer, { className: 'enter-password-view__error', variant: 'error', withIcon: false, children: error })), jsxRuntime.jsx(Input.Input, { id: 'enter-password-input', type: showPassword ? 'text' : 'password', label: t('dyn_enter_password.label'), placeholder: t('dyn_enter_password.placeholder'), value: password, onChange: handlePasswordChange, variant: 'regular', suffix:
64
+ return (jsxRuntime.jsx("div", { className: 'enter-password-view', children: jsxRuntime.jsxs("div", { className: 'enter-password-view__body', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'title', color: 'primary', copykey: 'dyn_enter_password.title', className: 'enter-password-view__title', style: { marginBottom: '24px', textAlign: 'center' }, children: title !== null && title !== void 0 ? title : t('dyn_enter_password.title') }), jsxRuntime.jsx("div", { className: 'enter-password-view__icon-container', children: jsxRuntime.jsx(Icon.Icon, { color: 'brand-primary', children: jsxRuntime.jsx(passwordLockIcon.ReactComponent, { width: 64, height: 64 }) }) }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_enter_password.description', className: 'enter-password-view__description', children: description !== null && description !== void 0 ? description : t('dyn_enter_password.description') }), jsxRuntime.jsx(Input.Input, { id: 'enter-password-input', type: showPassword ? 'text' : 'password', label: t('dyn_enter_password.label'), placeholder: t('dyn_enter_password.placeholder'), value: password, onChange: handlePasswordChange, variant: 'regular', error: Boolean(error), message: error ? (jsxRuntime.jsxs("span", { className: 'enter-password-view__error-message', children: [jsxRuntime.jsx(errorCircleX.ReactComponent, { width: 14, height: 14 }), error] })) : undefined, suffix:
55
65
  // eslint-disable-next-line react/jsx-wrap-multilines
56
66
  jsxRuntime.jsx(ToggleVisibilityButton.ToggleVisibilityButton, { initialState: true, onClick: handleToggleVisibility }) }), jsxRuntime.jsx("div", { className: 'enter-password-view__actions', children: jsxRuntime.jsx(TypographyButton.TypographyButton, { dataTestId: 'enter-password-continue-button', onClick: handleContinue, disabled: !password || loading, copykey: 'dyn_enter_password.button.continue', buttonVariant: 'brand-primary', typographyProps: {
57
67
  color: 'inherit',