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